﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Commander_Wars.Spieletools
Public Class ObjektKartenauswahlMenue
    Inherits ObjektFormMenue

    Const XOffSetFuerKOUndPanels As Integer = 350
    Const UPDATERATE As Integer = 25
#Region "Variablen"
    ''' <summary>
    ''' Name of the origin Name
    ''' </summary>
    ''' <remarks></remarks>
    Private Mapnames As New List(Of String)
    ''' <summary>
    ''' Name that should be shown in the Menu
    ''' </summary>
    ''' <remarks></remarks>
    Private MapTranslations As New List(Of String)
    Public Function TranslateMapName(ByVal Mapname As String) As String
        For i = 0 To Mapnames.Count - 1
            If Mapnames(i).ToLower = Mapname.ToLower Then
                Return MapTranslations(i)
            End If
        Next
        Return Mapname
    End Function
    Enum KAModi
        KartenAuswahl
        SpielerAuswahl
        RegelnFestlegen
        StartBereit
        ''' <summary>
        ''' Noch nicht verwendet aber eine Lobby ist bestimmt nichts schlechtes
        ''' </summary>
        ''' <remarks></remarks>
        Lobby
        ''' <summary>
        ''' Wir wollen eine Zufallskarte erstellen.
        ''' </summary>
        ''' <remarks></remarks>
        Zufallskarte
    End Enum
    ''' <summary>
    ''' Die Missionswelt, falls wir in einer Untermissions-Story sind
    ''' </summary>
    ''' <remarks></remarks>
    Public Overworld As ObjektLandkartenInfos

    Public AllowMapBrowsing As Boolean = True
    ''' <summary>
    ''' Die KO's der Spieler
    ''' </summary>
    ''' <remarks></remarks>
    Public KOS(,) As ObjektKO = {}
    ''' <summary>
    ''' Die Farbtabellen
    ''' </summary>
    ''' <remarks></remarks>
    Public Farbtabellen() As Color = {}
    ''' <summary>
    ''' Die Teams
    ''' </summary>
    ''' <remarks></remarks>
    Public Teams() As Char = {}
    ''' <summary>
    ''' Die Fonds pro Stadt
    ''' </summary>
    ''' <remarks></remarks>
    Public FondsproStadt() As Integer = {}
    ''' <summary>
    ''' Die Fonds pro Fabrik
    ''' </summary>
    ''' <remarks></remarks>
    Public FondsproFabrik() As Integer = {}
    ''' <summary>
    ''' Startfonds der Spieler
    ''' </summary>
    ''' <remarks></remarks>
    Public Startfonds() As Integer = {}
    ''' <summary>
    ''' Alle geladenen Karten
    ''' </summary>
    ''' <remarks></remarks>
    Public SpielKarten() As ObjektSpielfeld
    ''' <summary>
    ''' Der Dateipfad der Karten
    ''' </summary>
    ''' <remarks></remarks>
    Public Kartenname() As String = {}
    ''' <summary>
    ''' Die momentane Karte
    ''' </summary>
    ''' <remarks></remarks>
    Public MomentaneKartenName As String
    ''' <summary>
    ''' Der Modus in dem wir unss befinden
    ''' </summary>
    ''' <remarks></remarks>
    Public KAModus As KAModi
    ''' <summary>
    ''' Die Baulisten der Spieler
    ''' </summary>
    ''' <remarks></remarks>
    Public Baulisten() As Bauliste = {}
    ''' <summary>
    ''' Die KI Stufen
    ''' </summary>
    ''' <remarks></remarks>
    Public KIStufen() As ObjektSpieler.KIStufen = {}
    ''' <summary>
    ''' Names of the Player
    ''' </summary>
    ''' <remarks></remarks>
    Public Spielernamen() As String = {}
    ''' <summary>
    ''' Die Anzeige Modi der Karten
    ''' </summary>
    ''' <remarks></remarks>
    Public KartenAnzeigeModi As Integer() = {-1}
    ''' <summary>
    ''' Der momentane Anzeige Modus!
    ''' </summary>
    ''' <remarks></remarks>
    Public MomentanerAnzeigeModus As Integer = 0
    ''' <summary>
    ''' Normaler Text
    ''' </summary>
    ''' <remarks></remarks>
    Dim Text As ObjektText
    ''' <summary>
    ''' Kleiner Text
    ''' </summary>
    ''' <remarks></remarks>
    Dim KleinerText As ObjektText
    ''' <summary>
    ''' Auswahlrechteck fuer die Karten
    ''' </summary>
    ''' <remarks></remarks>
    Dim KartenauswahlRechteck As Rectangle
    ''' <summary>
    ''' Die Anzahln der Gebaeude
    ''' </summary>
    ''' <remarks></remarks>
    Dim GebaeudeZahl As Point() = {}
    ''' <summary>
    ''' Texturen fuer die KO's
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared KOAnzeigeTexturen() As Texture = {}
    ''' <summary>
    ''' Armeebanner
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared ArmeeBanner() As Texture = {}
    ''' <summary>
    ''' Die Armeen
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Armeen() As String = {}
    ''' <summary>
    ''' Die Position bei der KO Auswahl
    ''' </summary>
    ''' <remarks></remarks>
    Dim KOCursor As Point
    ''' <summary>
    ''' Der Startindex fuer die Karten
    ''' </summary>
    ''' <remarks></remarks>
    Public KartenStartIndex As Integer
    ''' <summary>
    ''' Die momentane Karte
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared MomentaneKarte As Integer
    ''' <summary>
    ''' Die Armee von der die KO's angezeigt werden
    ''' </summary>
    ''' <remarks></remarks>
    Dim AusgewaehlteArmee As Integer = 0
    ''' <summary>
    ''' Die KO's die wir malen muessen
    ''' </summary>
    ''' <remarks></remarks>
    Dim AnzahlderGemaltenKos As Integer = 0
    ''' <summary>
    ''' Die Anzahl der Spieler der momentanen Karte
    ''' </summary>
    ''' <remarks></remarks>
    Dim AnzahlderSpieler As Integer = 0
    ''' <summary>
    ''' Der Spieler den wir momentan veraendern
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared MomentanerSpieler As Integer = 0
    ''' <summary>
    ''' Die Namen der Karten, die wir anzeigen
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared KartenNamen() As String
    ''' <summary>
    ''' Die Karten die wir anzeigen
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared AngezeigteKarten() As Integer
    ''' <summary>
    ''' Der KO der gerade ausgewaehlt ist
    ''' </summary>
    ''' <remarks></remarks>
    Dim MomentanerKO As Integer = 0
    ''' <summary>
    ''' Checkboxen welche Einheiten wir bauen koennen
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared EinheitenCheckboxen As ObjektEinheitenCheckbox
    ''' <summary>
    ''' Die Breite von ich weiss nicht was
    ''' </summary>
    ''' <remarks></remarks>
    Dim SpielerZahlAnzeigeBreiten As Integer() = {}

    Public SpielerBauprioritaeten As KIGenerellerSuperBau.PrioritaetsBau() = {}
    ''' <summary>
    ''' Die entsprechende Hoehe
    ''' </summary>
    ''' <remarks></remarks>
    Dim SpielerZahlAnzeigeHoehe As Integer
    Public Regeln As ObjektRegeln = Nothing
    Public Spielerdaten() As Spieler = {}
    Dim AlleSpielerVeraenderung As AlleSpieler
    Dim Updateframe As Integer = 0
    Public KOInformation As ObjektKOInformation

    Dim bStartbereitShowButtons As Boolean = False
    Dim Frames As Integer = 0

    Dim AusgewaehlterDirectory As Integer = 0
    Dim DirectoryPfade As New List(Of String)

    Public RuleRecieved As Boolean = False
    Public Class ClientPlayerData
        Public Player As Integer
        Public Team As Char
        Public Autor As String
        Public KO1 As String
        Public KO2 As String
        Public farbe As Color
        Public PlayerID As Integer
        Public Sub New(ByVal Player As Integer, ByVal Team As Char, ByVal Autor As String, ByVal KO1 As String, ByVal KO2 As String, ByVal farbe As Color, ByVal PlayerID As Integer)
            Me.PlayerID = PlayerID
            Me.Player = Player
            Me.Team = Team
            Me.Autor = Autor
            Me.KO1 = KO1
            Me.KO2 = KO2
            Me.farbe = farbe
        End Sub
    End Class

    Public ClientDatas As New List(Of ClientPlayerData)
    Public ClientDataMutex As New Mutex
#Region "Netzwerk"
    Public ErstesUpdateEmpfangen As Boolean = False

    Public Host As Boolean = False

    Public FirstWeiter As Boolean = False
    ''' <summary>
    ''' Says if we have received all Custom Stuff for this Game
    ''' </summary>
    ''' <remarks></remarks>
    Public CustomStuffReceieved As Boolean = False

    Protected SpielInizialiesiert As Boolean = False
#End Region
#End Region
    Public Sub New(Optional ByVal Netzwerkmenue As Boolean = False)
        MyBase.New(New ObjektButton() {}, Nothing, New ObjektNumericUpDown() {}, Nothing, New ObjektValueSchieber() {}, New ObjektMultiValue() {}, New ObjektCheckBox() {})
        If Netzwerkmenue = False Then
            If DataSettings.Verhaeltnis = Hauptmenue.Breitbild Then
                Objektverwalter.LoadHintergrund(DataSettings.Resourcenpfad + "Backgrounds\SAHintergrundGross.png")
            Else
                Objektverwalter.LoadHintergrund(DataSettings.Resourcenpfad + "Backgrounds\SAHintergrund.png")
            End If
        End If



        If ArmeeBanner.Length = 0 Then
            For I1 = 0 To Objektverwalter.GetKOLength() - 1
                If Array.IndexOf(Armeen, Objektverwalter.GetKO(I1).Armee) < 0 Then
                    If Not Hauptmenue.User.LockedCOs.Contains(Objektverwalter.GetKO(I1).KOID) Then
                        Array.Resize(ArmeeBanner, ArmeeBanner.Length + 1)
                        Array.Resize(Armeen, ArmeeBanner.Length)
                        ArmeeBanner(ArmeeBanner.Length - 1) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Kartenauswahl\" + Objektverwalter.GetKO(I1).Armee + ".png")
                        Armeen(Armeen.Length - 1) = Objektverwalter.GetKO(I1).Armee
                    End If
                End If
            Next
        End If




        Text = New ObjektText(New String() {}, 0, 0, Nothing, Schriftengine.Schriftarten.Arial, 12, FontStyle.Regular)
        KleinerText = New ObjektText(New String() {}, 0, 0, Nothing, Schriftengine.Schriftarten.Arial_Unicode_MS, 8, FontStyle.Regular)
        If Netzwerkmenue = False Then
            KartenAuswahlErstellen()
        End If
    End Sub

    Public Shared Sub KOAnzeigeTexturenKaden(ByVal Farbtabelle As Color)
        Array.Resize(KOAnzeigeTexturen, 3)
        KOAnzeigeTexturen(0) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Kartenauswahl\KOAuswahl.png"), Hauptmenue.Farbtabelleerstellen(Farbtabelle))
        KOAnzeigeTexturen(1) = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Kartenauswahl\KeinKO.png")
        KOAnzeigeTexturen(2) = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Kartenauswahl\KOAnzeigeCursor.png"), Hauptmenue.Farbtabelleerstellen(Farbtabelle))
        EinheitenCheckboxen.NeueFarbtabelle(Farbtabelle)
    End Sub

    Public Overrides Sub Frame()
        Frames += 1
        If Frames > 7 Then
            Frames = 0
            CheckButtonStarten()
            'einfach immer mal wieder pruefen, wie das mit den Starten steht.
        End If
    End Sub
    Public Sub AddKarte(ByVal Datei As String)
        If Kartenname Is Nothing Then ReDim Kartenname(-1)
        Array.Resize(Kartenname, Kartenname.Length + 1)
        If SpielKarten Is Nothing Then ReDim SpielKarten(-1)
        Array.Resize(SpielKarten, SpielKarten.Length + 1)
        Kartenname(Kartenname.Length - 1) = Datei
        SpielKarten(SpielKarten.Length - 1) = Hauptmenue.KarteDefaultLaden(Datei)
        If AngezeigteKarten Is Nothing Then ReDim AngezeigteKarten(0)
        MomentaneKarte = SpielKarten.Length - 1
        If AngezeigteKarten.Length <= MomentaneKarte Then
            Array.Resize(AngezeigteKarten, AngezeigteKarten.Length + 1)
            MomentaneKarte = AngezeigteKarten.Length - 1
        End If
        AngezeigteKarten(MomentaneKarte) = SpielKarten.Length - 1
        KartenauswahlAktualiesieren()
    End Sub
#Region "Malen"
    Dim Desc As String() = {}
    Dim DescKarte As Integer = -1
    Dim UpdateDesc As Boolean = False
    Public Overrides Sub Malen()

        Select Case KAModus
            Case ObjektKartenauswahlMenue.KAModi.KartenAuswahl
                KartenAuswahlMalen()
            Case ObjektKartenauswahlMenue.KAModi.SpielerAuswahl
                SpielerAuswahlMalen()
            Case ObjektKartenauswahlMenue.KAModi.RegelnFestlegen
                RegelnMalen()
            Case KAModi.Lobby
                LobbyMalen()
            Case KAModi.Zufallskarte
                ZufallskarteMalen()
        End Select
        MyBase.ObjekteMalen()
        Select Case KAModus
            Case ObjektKartenauswahlMenue.KAModi.SpielerAuswahl
                If KOCursor.Y > 0 And MomentanerKO >= 0 Then
                    Objektverwalter.GetKO(MomentanerKO).KOMalen(XOffSetFuerKOUndPanels, 55)
                End If
        End Select
        'Das malen wir zu letzt!
        If Not KOInformation Is Nothing Then
            KOInformation.Malen()
        End If
    End Sub
    Private Sub KartenAuswahlMalen()
        Dim M As ObjektKartenauswahlMenue = Objektverwalter.Menue
        Dim sngRotation As Double = 0
        Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.recBild = Nothing
        Grafikengine.ptfRotCenter = Nothing
        Grafikengine.szfScale = Nothing
        Grafikengine.ptfPosition = New Drawing.Point(10, 50)
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Grafikengine.ptfPosition.Y += 10
        For I = 0 To KartenNamen.Length - 1
            Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(1), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Grafikengine.ptfPosition.Y += 21
        Next
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(2), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        If AngezeigteKarten.Length > 0 Then
            Grafikengine.ptfPosition = New Drawing.Point(16, 61 + MomentaneKarte * 21)
            Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(3), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        End If
        Text.neuerText(KartenNamen, 16, 61, Nothing, , )
        Text.Malen(New Point)
        If SpielKarten.Length > 0 Then
            Text.neuerText(New String() {M.SpielKarten(AngezeigteKarten(MomentaneKarte)).Kartenname + "     " + Sprachconverter.Translate("Autor") + ":  " + M.SpielKarten(AngezeigteKarten(MomentaneKarte)).Autor, Sprachconverter.Translate("Beschreibung") + ":  "}, 400, 79, Nothing)
            Text.Malen(New Point)
            If DescKarte <> AngezeigteKarten(MomentaneKarte) Or UpdateDesc Then
                Desc = ObjektText.getStringsZeilenweise(M.SpielKarten(AngezeigteKarten(MomentaneKarte)).Beschreibung.Split("|"), Text.GetSchriftart, DataSettings.BildschirmBreite - 400)
                DescKarte = AngezeigteKarten(MomentaneKarte)
                If Objektverwalter.Minimap IsNot Nothing Then
                    Objektverwalter.Minimap.P.Y = 130 + 21 * Desc.Length
                End If
                UpdateDesc = False
            End If
            Text.neuerText(Desc, 400, 120, Nothing)
            Text.Malen(New Point)
        End If
        'Hm Jetzt sollten wir noch zwei andere Dinge Anzeigen. 
        'Wir malen die Anzeige welche Karten wir angezeigt haben wollen
        Dim Breite As Integer = 16
        Dim Startpunkt As Point = New Point(DataSettings.BildschirmBreite - 20 - 8, 10)
        For I = 0 To SpielerZahlAnzeigeBreiten.Length - 1
            Startpunkt.X += (-12 - SpielerZahlAnzeigeBreiten(I))
        Next
        Startpunkt.X -= 8
        Grafikengine.ptfRotCenter = Nothing
        Grafikengine.szfScale = Nothing
        With Grafikengine.recBild
            .X = 0 : .Width = 8
            .Y = 0 : .Height = 40
        End With
        Grafikengine.ptfPosition = Startpunkt
        'linker Anfang
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Grafikengine.ptfPosition.X += 8
        'Mitte
        With Grafikengine.recBild
            .X = 8 : .Width = 12
            .Y = 0 : .Height = 40
        End With
        Dim R As Integer = 0
        Dim Max As Integer = Math.DivRem(DataSettings.BildschirmBreite - Startpunkt.X - 20 - 8, 12, R)
        If R <> 0 Then Max += 1
        For I = 1 To Max
            If I = Max Then
                With Grafikengine.recBild
                    .X = 8 : .Width = R
                    .Y = 0 : .Height = 40
                End With
                Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.ptfPosition.X += R

            Else
                Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.ptfPosition.X += 12
            End If
        Next
        'Rechtes Ende
        With Grafikengine.recBild
            .X = 20 : .Width = 8
            .Y = 0 : .Height = 40
        End With
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Startpunkt.X += 20
        Startpunkt.Y += 20 - SpielerZahlAnzeigeHoehe / 2
        'Wir malen noch die Schrift

        For I = 0 To SpielerZahlAnzeigeBreiten.Length - 1
            Dim Farbe As Color = Color.White
            If I = M.MomentanerAnzeigeModus Then Farbe = Color.Red
            Dim T As String = M.KartenAnzeigeModi(I).ToString
            If M.KartenAnzeigeModi(I) < 0 Then T = Sprachconverter.Translate("Alle")
            Text.neuerText(New String() {T}, Startpunkt.X, Startpunkt.Y, New Color() {Farbe})
            Text.Malen(New Point)
            Startpunkt.X += 12 + SpielerZahlAnzeigeBreiten(I)
        Next

        'Wir malen die Anzeige welche und wie viele Gebaeude es von den Jeweiligen Typen gibt.
        Startpunkt = New Point(350, DataSettings.BildschirmHoehe - 150)

        'Wir malen Staedte,Basen,Haefen,Flughaefen,HQS,Silos,Tuerme, Minen,Labor,Pipestation.
        Grafikengine.ptfRotCenter = Nothing
        Grafikengine.szfScale = New Size(8, Hauptmenue.Feldbreite * 2 + 12 + SpielerZahlAnzeigeHoehe)
        With Grafikengine.recBild
            .X = 0 : .Width = 8
            .Y = 0 : .Height = 40
        End With
        Grafikengine.ptfPosition = Startpunkt
        'linker Anfang
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Grafikengine.ptfPosition.X += 8
        'Mitte
        With Grafikengine.recBild
            .X = 8 : .Width = 12
            .Y = 0 : .Height = 40
        End With
        Grafikengine.szfScale = New Size(12, Hauptmenue.Feldbreite * 2 + 12 + SpielerZahlAnzeigeHoehe)
        R = 0
        Max = Math.DivRem((Hauptmenue.Feldbreite + 12) * GebaeudeZahl.Length + 12, 12, R)

        If GebaeudeZahl.Length = 0 Then
            MinimapAktualisieren()
        End If

        If R <> 0 Then Max += 1
        For I = 1 To Max
            If I = Max Then
                With Grafikengine.recBild
                    .X = 8 : .Width = R
                    .Y = 0 : .Height = 40
                End With
                Grafikengine.szfScale = New Size(R, Hauptmenue.Feldbreite * 2 + 12 + SpielerZahlAnzeigeHoehe)
                Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.ptfPosition.X += R

            Else
                Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.ptfPosition.X += 12
            End If
        Next
        'Rechtes Ende
        With Grafikengine.recBild
            .X = 20 : .Width = 8
            .Y = 0 : .Height = 40
        End With
        Grafikengine.szfScale = New Size(8, Hauptmenue.Feldbreite * 2 + 12 + SpielerZahlAnzeigeHoehe)
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Grafikengine.szfScale = Nothing
        With Grafikengine.recBild
            .X = 0 : .Width = Hauptmenue.Feldbreite
            .Y = 0 : .Height = Hauptmenue.Feldbreite * 2
        End With
        For I = 0 To GebaeudeZahl.Length - 1
            Grafikengine.ptfPosition = New Point(Startpunkt.X + 20 + I * (12 + Hauptmenue.Feldbreite), Startpunkt.Y + 4)
            If Objektverwalter.AlleGebaeude(GebaeudeZahl(I).Y).NurNeutral Then
                Grafikengine.Sprite.Draw2D(Objektverwalter.AlleGebaeude(GebaeudeZahl(I).Y).GebaeudetexturNeutral, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Else
                Grafikengine.Sprite.Draw2D(Objektverwalter.AlleGebaeude(GebaeudeZahl(I).Y).Gebaeudetextur(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.Sprite.Draw2D(Objektverwalter.AlleGebaeude(GebaeudeZahl(I).Y).GebaeudetexturMaske(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            End If

        Next

        'Wir malen noch die Schrift
        Grafikengine.Sprite.Transform = Matrix.Identity
        For I = 0 To GebaeudeZahl.Length - 1
            Dim Farbe As Color = Color.White
            Dim T As String = GebaeudeZahl(I).X.ToString
            Dim TBreite As Integer = Text.GetSchriftart.MeasureString(Grafikengine.Sprite, T, DrawTextFormat.None, Color.White).Width
            Text.neuerText(New String() {T}, Startpunkt.X + 28 + I * (Hauptmenue.Feldbreite + 12) - TBreite / 2, Startpunkt.Y + Hauptmenue.Feldbreite * 2 + 8, New Color() {Farbe})
            Text.Malen(New Point)
        Next
        If AllowMapBrowsing Then
            'Anderer Ordner!
            If DropDownMenues(0).GetItemNumber <> AusgewaehlterDirectory Then
                ChangeDirectory(DropDownMenues(0).GetItemNumber)
            End If
        End If
    End Sub
    Public Sub SpielerAuswahlMalen()
        Dim M As ObjektKartenauswahlMenue = Objektverwalter.Menue
        If EinheitenCheckboxen IsNot Nothing Then
            EinheitenCheckboxen.Malen()
        End If
        Dim sngRotation As Double = 0
        Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.recBild = Nothing
        Grafikengine.ptfRotCenter = Nothing
        Grafikengine.szfScale = Nothing
        Grafikengine.ptfPosition = New Drawing.Point(10, 0)
        For I = 0 To ArmeeBanner.Length - 1
            If I = AusgewaehlteArmee Then
                Grafikengine.recBild = Nothing
            Else
                With Grafikengine.recBild
                    .Y = 11
                    .Width = 20
                    .Height = 42
                End With
            End If
            Grafikengine.Sprite.Draw2D(ArmeeBanner(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Grafikengine.ptfPosition.X += 19
        Next
        Grafikengine.recBild = Nothing
        Grafikengine.ptfPosition = New Drawing.Point(0, 53)
        Grafikengine.Sprite.Draw2D(KOAnzeigeTexturen(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Grafikengine.ptfPosition.X += 2
        Grafikengine.ptfPosition.Y += 9
        Grafikengine.Sprite.Draw2D(KOAnzeigeTexturen(1), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        intColor = Color.FromArgb(180, 255, 255, 255)

        Dim Start As Boolean = True
        Grafikengine.ptfPosition = New Drawing.Point(0, 10)
        Dim StartzahlderKOs As Integer = IndexOfArmee(Armeen(AusgewaehlteArmee))
        Dim I2 As Integer = StartzahlderKOs
        While I2 < Objektverwalter.GetKOLength()
            If Objektverwalter.GetKO(I2).Armee = Armeen(AusgewaehlteArmee) Then
                Grafikengine.ptfPosition.X = 2
                Grafikengine.ptfPosition.Y += 52
                Dim Ende As Integer = 2
                If Start Then
                    Grafikengine.ptfPosition.X += 52
                    Ende = 1
                    Start = False
                End If
                For I = 0 To Ende
                    If I2 < Objektverwalter.GetKOLength() Then
                        If Not Hauptmenue.User.LockedCOs.Contains(Objektverwalter.GetKO(I2).KOID) Then
                            Grafikengine.Sprite.Draw2D(KOAnzeigeTexturen(2), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                            Grafikengine.ptfPosition.X += 52
                        Else
                            I -= 1
                        End If
                        I2 += 1
                    Else
                        Grafikengine.Sprite.Draw2D(KOAnzeigeTexturen(2), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                        Grafikengine.ptfPosition.X += 52
                    End If
                Next
            Else
                Exit While
            End If
        End While
        intColor = Color.FromArgb(255, 255, 255, 255)

        Start = True
        Grafikengine.ptfPosition = New Drawing.Point(0, 10)
        I2 = StartzahlderKOs
        While I2 < Objektverwalter.GetKOLength()
            Grafikengine.ptfPosition.X = 2
            Grafikengine.ptfPosition.Y += 52
            Dim Ende As Integer = 2
            If Start Then
                Grafikengine.ptfPosition.X += 52
                Ende = 1
                Start = False
            End If
            For I = 0 To Ende
                If Objektverwalter.GetKO(I2).Armee = ObjektKartenauswahlMenue.Armeen(AusgewaehlteArmee) Then
                    If Not Hauptmenue.User.LockedCOs.Contains(Objektverwalter.GetKO(I2).KOID) Then
                        Objektverwalter.GetKO(I2).KOGesichtsausdruckMalen(0, Grafikengine.ptfPosition.X, Grafikengine.ptfPosition.Y)
                        Grafikengine.ptfPosition.X += 52
                    Else
                        I -= 1
                    End If
                    I2 += 1
                Else
                    Exit While
                End If
                If I2 >= Objektverwalter.GetKOLength() Then Exit While
            Next
        End While
        Grafikengine.recBild = Nothing
        Grafikengine.ptfPosition = KOCursor
        Grafikengine.Sprite.Draw2D(KOAnzeigeTexturen(2), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)

        If IsNothing(M.KOS(MomentanerSpieler, 0)) = False Then
            Objektverwalter.GetKO(M.KOS(MomentanerSpieler, 0).Bild).MiniGesichtMalen(167, 212, False)
            Text.neuerText(New String() {M.KOS(MomentanerSpieler, 0).KOname}, 34, -3, Nothing, , 0)
            Text.Malen(Grafikengine.ptfPosition)
            If IsNothing(M.KOS(MomentanerSpieler, 1)) = False Then
                Grafikengine.ptfPosition.Y += 16
                Objektverwalter.GetKO(M.KOS(MomentanerSpieler, 1).Bild).MiniGesichtMalen(Grafikengine.ptfPosition.X, Grafikengine.ptfPosition.Y, False)
                Text.neuerText(New String() {M.KOS(MomentanerSpieler, 1).KOname}, 34, -3, Nothing, , 0)
                Text.Malen(Grafikengine.ptfPosition)
            End If
        End If
        If MomentanerKO >= 0 Then
            If MomentanerKO >= Objektverwalter.GetKOLength() Then
                MomentanerKO = 0
            End If
            Grafikengine.Sprite.Transform = Matrix.Identity
            Dim X As Integer = Text.GetSchriftart.MeasureString(Grafikengine.Sprite, Objektverwalter.GetKO(MomentanerKO).KOBeschreibung.Name, DrawTextFormat.None, Color.Black).Width / 2
            Text.neuerText(New String() {Objektverwalter.GetKO(MomentanerKO).KOBeschreibung.Name}, 165 + 178 / 2 - X, 70, Nothing)
            Text.Malen(New Point)
            If Objektverwalter.GetKO(MomentanerKO).KOBeschreibung.Stil.Length > 0 Then
                KleinerText.neuerText(Objektverwalter.GetKO(MomentanerKO).KOBeschreibung.Stil, 165, 90, Nothing)
                KleinerText.Malen(New Point)
            End If
        End If
        AlleSpielerVeraenderung.Malen()
        For I = 0 To Spielerdaten.Length - 1
            Spielerdaten(I).Malen(Me)
        Next
        'Das KO Bild malen!

        'Wir schauen ob wir einen anderen Spieler haben
        UpdateSpielerAuswahl()
    End Sub
    Private Sub RegelnMalen()
        UpdateRegeln()
    End Sub
    Private Sub LobbyMalen()

    End Sub
    Private Sub ZufallskarteMalen()
        Dim sngRotation As Single = 0
        Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
        'Wir malen die Anzeige welche und wie viele Gebaeude es von den Jeweiligen Typen gibt.
        Dim Startpunkt As Point = New Point(350, DataSettings.BildschirmHoehe - 150)

        'Wir malen Staedte,Basen,Haefen,Flughaefen,HQS,Silos,Tuerme, Minen,Labor,Pipestation.
        Grafikengine.ptfRotCenter = Nothing
        Grafikengine.szfScale = New Size(8, Hauptmenue.Feldbreite * 2 + 12 + SpielerZahlAnzeigeHoehe)
        With Grafikengine.recBild
            .X = 0 : .Width = 8
            .Y = 0 : .Height = 40
        End With
        Grafikengine.ptfPosition = Startpunkt
        'linker Anfang
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Grafikengine.ptfPosition.X += 8
        'Mitte
        With Grafikengine.recBild
            .X = 8 : .Width = 12
            .Y = 0 : .Height = 40
        End With
        Grafikengine.szfScale = New Size(12, Hauptmenue.Feldbreite * 2 + 12 + SpielerZahlAnzeigeHoehe)
        Dim R As Integer = 0
        Dim Max As Integer = Math.DivRem((Hauptmenue.Feldbreite + 12) * GebaeudeZahl.Length + 12, 12, R)
        If R <> 0 Then Max += 1
        For I = 1 To Max
            If I = Max Then
                With Grafikengine.recBild
                    .X = 8 : .Width = R
                    .Y = 0 : .Height = 40
                End With
                Grafikengine.szfScale = New Size(R, Hauptmenue.Feldbreite * 2 + 12 + SpielerZahlAnzeigeHoehe)
                Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.ptfPosition.X += R

            Else
                Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.ptfPosition.X += 12
            End If
        Next
        'Rechtes Ende
        With Grafikengine.recBild
            .X = 20 : .Width = 8
            .Y = 0 : .Height = 40
        End With
        Grafikengine.szfScale = New Size(8, Hauptmenue.Feldbreite * 2 + 12 + SpielerZahlAnzeigeHoehe)
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Grafikengine.szfScale = Nothing
        With Grafikengine.recBild
            .X = 0 : .Width = Hauptmenue.Feldbreite
            .Y = 0 : .Height = Hauptmenue.Feldbreite * 2
        End With
        For I = 0 To GebaeudeZahl.Length - 1
            Grafikengine.ptfPosition = New Point(Startpunkt.X + 20 + I * (12 + Hauptmenue.Feldbreite), Startpunkt.Y + 4)
            If Objektverwalter.AlleGebaeude(GebaeudeZahl(I).Y).NurNeutral Then
                Grafikengine.Sprite.Draw2D(Objektverwalter.AlleGebaeude(GebaeudeZahl(I).Y).GebaeudetexturNeutral, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Else
                Grafikengine.Sprite.Draw2D(Objektverwalter.AlleGebaeude(GebaeudeZahl(I).Y).Gebaeudetextur(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.Sprite.Draw2D(Objektverwalter.AlleGebaeude(GebaeudeZahl(I).Y).GebaeudetexturMaske(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            End If

        Next

        'Wir malen noch die Schrift
        Grafikengine.Sprite.Transform = Matrix.Identity
        For I = 0 To GebaeudeZahl.Length - 1
            Dim Farbe As Color = Color.White
            Dim T As String = GebaeudeZahl(I).X.ToString
            Dim TBreite As Integer = Text.GetSchriftart.MeasureString(Grafikengine.Sprite, T, DrawTextFormat.None, Color.White).Width
            Text.neuerText(New String() {T}, Startpunkt.X + 28 + I * (Hauptmenue.Feldbreite + 12) - TBreite / 2, Startpunkt.Y + Hauptmenue.Feldbreite * 2 + 8, New Color() {Farbe})
            Text.Malen(New Point)
        Next


        UpdateZufallskarte()
    End Sub
#End Region
#Region "Event Handling"
    Public Overrides Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        If Not KeyDownObjekte(sender, e) Then
            If KOInformation Is Nothing Then
                Select Case KAModus
                    Case ObjektKartenauswahlMenue.KAModi.KartenAuswahl
                        Select Case e.KeyCode
                            Case DataSettings.Unten
                                KartenAnzeigeAuswaehlen(1)
                            Case DataSettings.Oben
                                KartenAnzeigeAuswaehlen(-1)
                            Case DataSettings.Rechts
                                ChangeAnzeigeKartenModus(MomentanerAnzeigeModus + 1)
                            Case DataSettings.Links
                                ChangeAnzeigeKartenModus(MomentanerAnzeigeModus - 1)
                            Case DataSettings.Bestaetigen
                                KAModus = ObjektKartenauswahlMenue.KAModi.SpielerAuswahl
                                KarteFestlegen(False)
                        End Select
                    Case Else
                        Select Case e.KeyCode
                            Case Keys.Escape
                                Hauptmenue.Ini(Hauptmenue.Formmodi.Hauptmenue)
                            Case DataSettings.Zurueck
                                Zurueck()
                            Case DataSettings.Vor
                                Weiter()
                            Case DataSettings.SelectTaste
                                SpielerFarbeAendern()
                        End Select
                End Select
            Else
                KOInformation.KeyDown(sender, e)
            End If
        End If
    End Sub
    Public Overrides Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        If KOInformation Is Nothing Then
            For I = 0 To Spielerdaten.Length - 1
                If Spielerdaten(I).MouseDown(sender, e) Then Exit Sub
            Next
            If AlleSpielerVeraenderung IsNot Nothing Then
                If AlleSpielerVeraenderung.MouseDown(sender, e) Then Exit Sub
            End If

            checkMouseDownObjekte(e.X, e.Y)

            If e.Button = Windows.Forms.MouseButtons.Right Then
                MouseUp(sender, e)
            End If
        Else
            KOInformation.MouseDown(sender, e)
        End If
    End Sub
    Public Overrides Sub MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        MouseMoveObjekte(e.X, e.Y)
        For I = 0 To Spielerdaten.Length - 1
            If Spielerdaten(I) IsNot Nothing Then
                Spielerdaten(I).MouseMove(sender, e)
            End If
        Next
        If AlleSpielerVeraenderung IsNot Nothing Then
            AlleSpielerVeraenderung.MouseMove(sender, e)
        End If
        Select Case KAModus
            Case ObjektKartenauswahlMenue.KAModi.KartenAuswahl
                GetMomentaneKarte(e.X, e.Y)
            Case ObjektKartenauswahlMenue.KAModi.SpielerAuswahl
                If KOInformation Is Nothing Then
                    GetKOCursorPosition(e.X, e.Y)
                End If
        End Select
    End Sub
    Public Overrides Sub MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        For I = 0 To Spielerdaten.Length - 1
            If Spielerdaten(I).MouseUp(sender, e) Then Exit Sub
        Next
        If AlleSpielerVeraenderung IsNot Nothing Then
            If AlleSpielerVeraenderung.MouseUp(sender, e) Then Exit Sub
        End If

        Dim Funktion As String = checkMouseUPObjekte(e.X, e.Y)
        If Funktion = "" Then


            Select Case e.Button
                Case MouseButtons.Left
                    Select Case KAModus
                        Case ObjektKartenauswahlMenue.KAModi.KartenAuswahl
                            KarteFestlegen(e.X, e.Y)
                        Case ObjektKartenauswahlMenue.KAModi.SpielerAuswahl
                            If CheckArmeeKlick(e.X, e.Y) = True Then
                            ElseIf CheckSpielerAuswahl(e.X, e.Y) = True Then
                            ElseIf EinheitenCheckboxen.CheckKlick(e.X, e.Y) = True Then
                            ElseIf Not checkMouseUPObjekte(e.X, e.Y) = "" Then
                            Else

                            End If
                        Case ObjektKartenauswahlMenue.KAModi.RegelnFestlegen

                    End Select
                Case MouseButtons.Right
                    Select Case KAModus
                        Case ObjektKartenauswahlMenue.KAModi.SpielerAuswahl
                            If KIStufen(MomentanerSpieler) <> ObjektSpieler.KIStufen.Passiv Then 'no Access for Host here?
                                If IsNothing(KOS(MomentanerSpieler, 1)) = False Then
                                    KOS(MomentanerSpieler, 1) = Nothing
                                ElseIf IsNothing(KOS(MomentanerSpieler, 0)) = False Then
                                    KOS(MomentanerSpieler, 0) = Nothing
                                Else

                                End If
                            End If
                        Case ObjektKartenauswahlMenue.KAModi.RegelnFestlegen
                    End Select
                Case MouseButtons.Middle
                    CheckKOInformationsAnzeige(e.X, e.Y)
            End Select
        Else
            Select Case Funktion.ToLower
                Case "zurueck"
                    Zurueck()
                Case "weiter"
                    Weiter()
                Case "starten"
                    KAModus = KAModi.StartBereit
                    Weiter()
                Case "spielerfarbe"
                    SpielerFarbeAendern()
                Case "vorige farbe"
                    AndereTabelle(-1)
                Case "naechste farbe"
                    AndereTabelle(1)
                Case "runter"
                    KartenRunterSuchen(1)
                Case "hoch"
                    KartenRunterSuchen(-1)
                Case "auswaehlen"
                    ChangeDirectory()
                Case "zufallskarte"
                    CreateZufallskartenMenue()
                Case "generieren"
                    CreateRandomMap()
                Case "naechste karte"
                    Textboxen(0).SetText(Zufallszahl(0, Integer.MaxValue - 1))
                    CreateRandomMap()
                Case "ko info"
                    KOInformation = New ObjektKOInformation(0, 0, IndexOfArmee(Armeen(AusgewaehlteArmee)), New PointF)
                Case "regel speichern"
                    WriteRule()
                Case "regel laden"
                    LoadRule()
            End Select
        End If
    End Sub
    Public Overrides Sub MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        If KOInformation IsNot Nothing Then
            KOInformation.MouseWheel(sender, e)
        End If
    End Sub
#End Region


    Public Overrides Sub SetMausBild()
        ObjektMaus.Zustand = ObjektMaus.Zustaende.Menue
    End Sub

    ''' <summary>
    ''' Laedt alle existierenden Karten in den RAM
    ''' </summary>
    ''' <param name="Ordner"></param>
    ''' <param name="Pfade"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function KartenLaden(ByVal Ordner As String, ByRef Pfade As Stack(Of String)) As ObjektSpielfeld()
        Dim Karten As New Stack(Of ObjektSpielfeld)
        Dim Pfade1 As New Stack(Of String)
        'Kartenserien (Kampagnen) werden in extra Ordnern gespeichert.
        'Dort jeweils die erste Karte laden. Sie werden zuerst geladen, da sie ganz oben aufgelistet werden sollen.
        If Not TypeOf Objektverwalter.Menue Is ObjektNetzwerkMenue Then
            For Each Kamp In My.Computer.FileSystem.GetDirectories(Ordner, FileIO.SearchOption.SearchTopLevelOnly, "*.kamp")
                If My.Computer.FileSystem.FileExists(Kamp + "\Landkarte.ini.comp") Then
                    My.Computer.FileSystem.CopyFile(Kamp + "\Landkarte.ini.comp", Kamp + "\Landkarte.ini", True)
                End If
                If My.Computer.FileSystem.FileExists(Kamp + "\Landkarte.ini") Then
                    Dim Reader As New IO.StreamReader(Kamp + "\Landkarte.ini")
                    Dim Name As String = ""
                    Dim Desc As String = ""
                    Dim NameSet As Boolean = False
                    While Reader.EndOfStream = False
                        Dim z As String = Reader.ReadLine
                        If Not NameSet Then
                            If z.ToLower.StartsWith("name:") Then
                                Name = z.Remove(0, z.IndexOf(":") + 1)
                                Continue While
                            End If
                            Dim Languages() As String = [Enum].GetNames(Sprachen.English.GetType)
                            If z.ToLower.StartsWith(Languages(DataSettings.Sprache).ToLower + ":") Then
                                NameSet = True
                                Name = z.Remove(0, z.IndexOf(":") + 1)
                            End If
                        End If
                        If z.ToLower.StartsWith("desc:") Then
                            Desc = z.Remove(0, z.IndexOf(":") + 1)
                            Continue While
                        End If
                    End While
                    'Eine Karte als Startkarte laden
                    For Each Karte In My.Computer.FileSystem.GetFiles(Kamp, FileIO.SearchOption.SearchTopLevelOnly, "*.map")
                        Dim K As ObjektSpielfeld = Nothing
                        Using Stream As New IO.FileStream(Karte, IO.FileMode.Open, IO.FileAccess.Read)
                            Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                            Dim Loaded As Boolean = False
                            Try
                                K = DirectCast(Konverter.Deserialize(Stream), ObjektSpielfeld)
                                Loaded = True
                            Catch
                                Loaded = False
                            End Try
                            Stream.Close()
                            If Not Loaded Then
                                K = LoadMap(Karte)
                                If K Is Nothing Then
                                    Continue For
                                End If
                            End If
                            Dim CFarbe As Color = Nothing
                            For I = 0 To K.Spieler.Length - 1
                                If K.Spieler(I).Farbe = CFarbe Then
                                    If I = 0 Then
                                        K.Spieler(I).Farbe = Hauptmenue.SpielerNeutral
                                    Else
                                        K.Spieler(I).Farbe = Hauptmenue.GetFarbtabelle(I - 1)
                                    End If
                                End If
                            Next
                        End Using
                        K.Kartenname = Name
                        K.Beschreibung = Desc
                        If K.Hoehe = 0 Then
                            K.Hoehe = K.Landschaften.GetLength(1)
                            Hauptmenue.Speichern(Karte, , K, True)
                        End If
                        Karten.Push(K)
                        Pfade1.Push(Karte)
                        Exit For
                    Next
                Else
                    If Not My.Computer.FileSystem.FileExists(Kamp + "\Startkarte.map") Then Continue For 'Wenn die erste Karte aus irgendeinem Grund nicht existiert, machen wir besser trotzdem keinen Fehler.
                    Dim K As ObjektSpielfeld = Nothing
                    Using Stream As New IO.FileStream(Kamp + "\Startkarte.map", IO.FileMode.Open, IO.FileAccess.Read)
                        Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                        Dim Loaded As Boolean = False
                        Try
                            K = DirectCast(Konverter.Deserialize(Stream), ObjektSpielfeld)
                            Loaded = True
                        Catch
                            Loaded = False
                        End Try
                        Stream.Close()
                        If Not Loaded Then
                            K = LoadMap(Kamp + "\Startkarte.map")
                            If K Is Nothing Then
                                Continue For
                            End If
                        End If
                        Dim CFarbe As Color = Nothing
                        For I = 0 To K.Spieler.Length - 1
                            If K.Spieler(I).Farbe = CFarbe Then
                                If I = 0 Then
                                    K.Spieler(I).Farbe = Hauptmenue.SpielerNeutral
                                Else
                                    K.Spieler(I).Farbe = Hauptmenue.GetFarbtabelle(I - 1)
                                End If
                            End If
                        Next

                        If My.Computer.FileSystem.FileExists(Kamp + "\Startkarte.ini") Then
                            Dim Reader As New IO.StreamReader(Kamp + "\Startkarte.ini")
                            Dim NameSet As Boolean = False
                            While Reader.EndOfStream = False
                                Dim z As String = Reader.ReadLine
                                If Not NameSet Then
                                    If z.ToLower.StartsWith("name:") Then
                                        K.Kartenname = z.Remove(0, z.IndexOf(":") + 1)
                                        Continue While
                                    End If
                                    Dim Languages() As String = [Enum].GetNames(Sprachen.English.GetType)
                                    If z.ToLower.StartsWith(Languages(DataSettings.Sprache).ToLower + ":") Then
                                        NameSet = True
                                        K.Kartenname = z.Remove(0, z.IndexOf(":") + 1)
                                    End If
                                End If
                                If z.ToLower.StartsWith("desc:") Then
                                    K.Beschreibung = z.Remove(0, z.IndexOf(":") + 1)
                                    Continue While
                                End If
                            End While
                        End If
                    End Using
                    If K.Hoehe = 0 Then
                        K.Hoehe = K.Landschaften.GetLength(1)
                        Hauptmenue.Speichern(Kamp + "\Startkarte.map", , K, True)
                    End If
                    Karten.Push(K)
                    Pfade1.Push(Kamp + "\Startkarte.map")
                End If
            Next
        End If
        'Danach alle normalen Karten laden
        For Each Karte In My.Computer.FileSystem.GetFiles(Ordner, FileIO.SearchOption.SearchTopLevelOnly, "*.map")
            If (My.Computer.FileSystem.FileExists(Karte.Replace(".map", ".ini")) And Not TypeOf Objektverwalter.Menue Is ObjektNetzwerkMenue) Or Not My.Computer.FileSystem.FileExists(Karte.Replace(".map", ".ini")) Then
                Dim K As ObjektSpielfeld = Nothing
                Using Stream As New IO.FileStream(Karte, IO.FileMode.Open, IO.FileAccess.Read)
                    Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                    Dim Loaded As Boolean = False
                    Try
                        K = DirectCast(Konverter.Deserialize(Stream), ObjektSpielfeld)
                        Loaded = True
                    Catch
                        Loaded = False
                    End Try
                    Stream.Close()
                    If Not Loaded Then
                        K = LoadMap(Karte)
                        If K Is Nothing Then
                            Continue For
                        End If
                    End If
                    Dim CFarbe As Color = Nothing
                    For I = 0 To K.Spieler.Length - 1
                        If K.Spieler(I).Farbe = CFarbe Then
                            If I = 0 Then
                                K.Spieler(I).Farbe = Hauptmenue.SpielerNeutral
                            Else
                                K.Spieler(I).Farbe = Hauptmenue.GetFarbtabelle(I - 1)
                            End If
                        End If
                    Next

                    If My.Computer.FileSystem.FileExists(Karte.Replace(".map", ".ini")) Then
                        Dim NameSet As Boolean = False
                        Using Str As New IO.StreamReader(Karte.Replace(".map", ".ini"))
                            While Not Str.EndOfStream
                                Dim Z As String = Str.ReadLine.Trim
                                If Not NameSet Then
                                    If Z.ToLower.StartsWith("name:") Then
                                        K.Kartenname = Z.Remove(0, Z.IndexOf(":") + 1)
                                        Continue While
                                    End If
                                    Dim Languages() As String = [Enum].GetNames(Sprachen.English.GetType)
                                    If Z.ToLower.StartsWith(Languages(DataSettings.Sprache).ToLower + ":") Then
                                        NameSet = True
                                        K.Kartenname = Z.Remove(0, Z.IndexOf(":") + 1)
                                    End If
                                End If
                                If Z.ToLower.StartsWith("desc:") Then
                                    K.Beschreibung = Z.Remove(0, Z.IndexOf(":") + 1)
                                    Continue While
                                End If
                            End While
                        End Using
                    End If
                End Using
                If K.Hoehe = 0 Then
                    K.Hoehe = K.Landschaften.GetLength(1)
                    Hauptmenue.Speichern(Karte, , K, True)
                End If
                Karten.Push(K)
                Pfade1.Push(Karte)
            End If
        Next
        Dim K1 As New Stack(Of ObjektSpielfeld)
        While Karten.Count > 0
            If TypeOf Objektverwalter.Menue Is ObjektKartenauswahlMenue Then
                Karten.Peek.Kartenname = CType(Objektverwalter.Menue, ObjektKartenauswahlMenue).TranslateMapName(Karten.Peek.Kartenname)
            End If

            K1.Push(Karten.Pop)
            Pfade.Push(Pfade1.Pop)
        End While
        Return K1.ToArray
    End Function
    Public Sub LoadMapTranslationsForFolder(ByVal Folder As String)
        Mapnames.Clear()
        MapTranslations.Clear()
        Dim Lng As Sprachen = DataSettings.Sprache
        If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Language\" + Lng.ToString + "\Maps.lng") Then
            Using StrR As New IO.StreamReader(DataSettings.Resourcenpfad + "Language\" + Lng.ToString + "\Maps.lng", Hauptmenue.Codierung)
                While Not StrR.EndOfStream
                    Dim L As String = StrR.ReadLine
                    Dim F As String = Folder.Replace(DataSettings.Resourcenpfad, "").Replace("Maps", "").Replace("\", "")
                    If Not L.StartsWith("'") Then
                        If Not L.StartsWith("//") Then
                            If L.ToLower.StartsWith(("Folder:" + F).ToLower) Then
                                While Not StrR.EndOfStream
                                    L = StrR.ReadLine
                                    If L.ToLower.StartsWith("end folder") Then
                                        Exit While
                                    ElseIf L.Contains("=") Then
                                        Dim S() As String = L.Split("=")
                                        Mapnames.Add(S(0))
                                        MapTranslations.Add(S(1))
                                    End If
                                End While
                            ElseIf L.ToLower.StartsWith("folder:") Then
                                While Not StrR.EndOfStream
                                    L = StrR.ReadLine
                                    If L.ToLower.StartsWith("end folder") Then
                                        Exit While
                                    End If
                                End While
                            Else
                                If L.Contains("=") Then
                                    Dim S() As String = L.Split("=")
                                    Mapnames.Add(S(0))
                                    MapTranslations.Add(S(1))
                                End If
                            End If
                        End If
                    End If
                End While
            End Using
        End If
    End Sub

    Public Overrides Sub IniMenue()
        If KAModus <> KAModi.Lobby Then
            ChangeAnzeigeKartenModus(0)
        Else

        End If
    End Sub

    Public Sub AddButton(ByVal X As Integer, ByVal Y As Integer, ByVal Bild As String, ByVal Text As String, ByVal Fixed As PointF)
        Array.Resize(Knoepfe, Knoepfe.Length + 1)
        Knoepfe(Knoepfe.Length - 1) = New ObjektButton(X, Y, Bild, Text, Fixed)
    End Sub

    ''' <summary>
    ''' Damit veraendern wir die Farbe des Spielers
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub SpielerFarbeAendern()
        If KAModus = KAModi.SpielerAuswahl Then
            If MessageBox.ShowColorDialogue(Sprachconverter.Translate("Spielerfarbe"), Farbtabellen(MomentanerSpieler)) = MsgBoxResult.Ok Then
                'So jetzt haben wir eine Farbe festgelegt.
                'Jetzt ordnen wir sie dem Spieler zu.
                Farbeaendern(MessageBox.CurrentColor)
                Spielerdaten(MomentanerSpieler - 1).SetSpielerFarbe(Farbtabellen(MomentanerSpieler).ToArgb.ToString)
            End If
        End If
    End Sub
    ''' <summary>
    ''' Aendert die Farbe des momentanen Spielers mit dieser Farbtabelle
    ''' </summary>
    ''' <param name="neueTabelle"></param>
    ''' <remarks></remarks>
    Private Sub Farbeaendern(ByVal neueTabelle As Color)
        Farbtabellen(MomentanerSpieler) = neueTabelle
        EinheitenCheckboxen.NeueFarbtabelle(New ObjektSpieler(MomentanerSpieler, neueTabelle, 0, Nothing, 0, "", "", Baulisten(MomentanerSpieler), KIStufen(MomentanerSpieler), 0), neueTabelle)
        KOAnzeigeTexturenKaden(neueTabelle)
    End Sub
    Public Sub AndereTabelle(ByVal Richtung As Integer)
        If Richtung > 1 Then
            Richtung = 1
        ElseIf Richtung < -1 Then
            Richtung = -1
        End If
        Dim MomentaneTabelle As Color = Farbtabellen(MomentanerSpieler)
        For I = 0 To Hauptmenue.AlleFarbtabellen.Length - 1
            Dim Tabelle As Color = Hauptmenue.AlleFarbtabellen(I)
            If Tabelle <> MomentaneTabelle Then
                'Wir haben die momentane Tabelle gefunden
                'wir legen die neue Tabelle fest.
                Dim NeueTabelle As Integer = I + Richtung
                If NeueTabelle < 0 Then
                    NeueTabelle = Hauptmenue.AlleFarbtabellen.Length - 1
                ElseIf NeueTabelle >= Hauptmenue.AlleFarbtabellen.Length Then
                    NeueTabelle = 0
                End If
                Farbeaendern(Hauptmenue.AlleFarbtabellen(NeueTabelle))
                'wir verlassen die Sub
                Exit Sub
            End If
        Next
    End Sub
    Public Overrides Sub SprachEingabe(ByVal Eingabe As String)
        Select Case Eingabe.ToLower
            Case "zurueck"
                Zurueck()
            Case "weiter"
                Weiter()
            Case "spielerfarbe"
                SpielerFarbeAendern()
            Case "vorige farbe"
                AndereTabelle(-1)
            Case "naechste farbe"
                AndereTabelle(1)
        End Select
    End Sub
    ''' <summary>
    ''' Gibt die Zahl der Karten zurueck die momentan angezeigt werden.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetKartenZahl() As Integer
        If KartenAnzeigeModi(MomentanerAnzeigeModus) < 0 Then
            Return SpielKarten.Length
        Else
            Dim Kartenzahl As Integer = 0
            For I = 0 To SpielKarten.Length - 1
                If SpielKarten(I).Spieler.Length - 1 = KartenAnzeigeModi(MomentanerAnzeigeModus) Then
                    Kartenzahl += 1
                End If
            Next
            Return Kartenzahl
        End If
    End Function
    ''' <summary>
    ''' Wir zeigen nur die Karten mit so viel Spielern an.
    ''' </summary>
    ''' <param name="NeuSpielerModus"></param>
    ''' <remarks></remarks>
    Public Sub ChangeAnzeigeKartenModus(ByVal NeuSpielerModus As Integer)
        If NeuSpielerModus < 0 Then NeuSpielerModus = 0
        If NeuSpielerModus > KartenAnzeigeModi.Length - 1 Then NeuSpielerModus = KartenAnzeigeModi.Length - 1
        KartenStartIndex = 0
        MomentanerAnzeigeModus = NeuSpielerModus
        MomentaneKarte = 0
        KartenauswahlAktualiesieren()

        MinimapAktualisieren()

        If AngezeigteKarten.Length - 1 < GetKartenZahl() - 1 Then
            If Not ExistiertButton("Runter") Then
                NeuButton(30, DataSettings.BildschirmHoehe - 55, DataSettings.Resourcenpfad + "Objects\Button.png", "Runter", New PointF(0, 1))
            End If
            If KartenStartIndex > 0 Then
                NeuButton(30, 20, DataSettings.Resourcenpfad + "Objects\Button.png", "Hoch", New PointF())
            End If
        Else
            LoeschenButton("Hoch")
            LoeschenButton("Runter")
        End If
    End Sub
    Public Function IsAnzeigeKarte(ByVal Karte As Integer) As Boolean
        If KartenAnzeigeModi(MomentanerAnzeigeModus) < 0 Then
            Return True
        Else
            If SpielKarten(Karte).Spieler.Length - 1 = KartenAnzeigeModi(MomentanerAnzeigeModus) Then
                Return True
            Else
                Return False
            End If
        End If
    End Function
    ''' <summary>
    ''' Wir starten ein neues Spiel
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Spielstart(ByVal KOAuswahlKOS() As ObjektLadebildschirm.KOAuswahl, ByVal EinKOProArmee As Boolean)
        Hauptmenue.EndCreatingObjects()
        Hauptmenue.Pause = True
        While Grafikengine.IsDrawing
            Threading.Thread.Sleep(ThreadSleepTime)
        End While

        'Wir starten das Spiel. Das heisst, alle Spieler starten das Spiel. Jetzt sind also erstmal alle Spieler nicht bereit. Wenn alle Spieler das Spiel gestartet haben, sind alle Spieler bereit und wir koennen anfangen.

        ResetSpielerAuswahl()

        'Ladebildschirm
        Dim Name As String = Kartenname(AngezeigteKarten(MomentaneKarte))
        If Name.Contains("\") Then
            If Name.Contains(".map") Then
                Dim LB As New ObjektLadebildschirm(KIStufen.Length - 1, SpielKarten(AngezeigteKarten(MomentaneKarte)).Beschreibung, Name, True, ".map", False, False, KOAuswahlKOS, EinKOProArmee)
            Else
                Dim LB As New ObjektLadebildschirm(KIStufen.Length - 1, SpielKarten(AngezeigteKarten(MomentaneKarte)).Beschreibung, Name, True, ".map", False, False, KOAuswahlKOS, EinKOProArmee)
            End If
        Else
            Dim LB As New ObjektLadebildschirm(KIStufen.Length - 1, SpielKarten(AngezeigteKarten(MomentaneKarte)).Beschreibung, Name, False, ".map", False, False, KOAuswahlKOS, EinKOProArmee)
        End If

        'Das fuer den Ladebildschirm
        Hauptmenue.Ini(Hauptmenue.Formmodi.Spiel, , True)
    End Sub
    Public Sub Spielstart()
        Spielstart(Nothing, False)
    End Sub
    Public Sub Weiter()
        Hauptmenue.StartCreatingObjects()
        Select Case KAModus
            Case KAModi.KartenAuswahl
                If AngezeigteKarten.Count > MomentaneKarte Then
                    KAModus = KAModi.RegelnFestlegen
                    FestlegenDerKarte(AngezeigteKarten(MomentaneKarte))
                    KarteFestlegen(True)
                    If Not TypeOf Objektverwalter.Menue Is ObjektSpielMenue Then
                        ResetKartenAuswahl()
                        RegelnFestlegen()
                    End If
                End If
            Case KAModi.RegelnFestlegen
                CreateRegeln()
                ResetRegelAuswahl(True)
                KAModus = KAModi.SpielerAuswahl
                SpielerAuswahlErstellen()
                ' LoeschenButton("Weiter")
            Case KAModi.SpielerAuswahl
                If SpielBereit() Then
                    If KAModus = KAModi.StartBereit Then
                        If Not Hauptmenue.Connection.Connected Then
                            Spielstart()
                        End If
                    End If
                End If
                NextPlayer(1)

            Case KAModi.StartBereit
                If SpielBereit() Then
                    If KAModus = KAModi.StartBereit Then
                        If Hauptmenue.Connection IsNot Nothing Then
                            If Not Hauptmenue.Connection.Connected Then
                                Spielstart()
                            End If
                        Else
                            Spielstart()
                        End If
                    End If
                End If
            Case KAModi.Lobby
                KAModus = KAModi.KartenAuswahl
                KartenAuswahlErstellen()
            Case KAModi.Zufallskarte
                KAModus = KAModi.RegelnFestlegen
                ResetZufallsMenue()
                RegelnFestlegen()
        End Select
        Hauptmenue.EndCreatingObjects()
    End Sub
    Public Sub Zurueck()
        Select Case KAModus
            Case KAModi.KartenAuswahl
                Hauptmenue.Ini(Hauptmenue.Formmodi.Hauptmenue)
            Case KAModi.RegelnFestlegen
                KAModus = KAModi.KartenAuswahl
                ResetRegelAuswahl(False)
                KartenAuswahlErstellen()
            Case KAModi.SpielerAuswahl
                If DropDownMenues(0).GetItemNumber <= 0 Then
                    If Hauptmenue.Connection.Connected Then
                        If Hauptmenue.Connection.Hosten Then
                            ResetSpielerAuswahl()
                            KAModus = KAModi.RegelnFestlegen
                            RegelnFestlegen()
                        Else
                            'Jetzt sollten wir zum Startmenue zurueck.
                        End If
                    Else
                        ResetSpielerAuswahl()
                        KAModus = KAModi.RegelnFestlegen
                        RegelnFestlegen()
                    End If
                Else
                    NextPlayer(-1)
                End If
            Case KAModi.Zufallskarte
                KAModus = KAModi.KartenAuswahl
                ResetZufallsMenue()
                KartenAuswahlErstellen()
        End Select
    End Sub
    Public Overrides Sub Reset()
        MyBase.Reset()
        If Not Spielerdaten Is Nothing Then
            For I = 0 To Spielerdaten.Length - 1
                Spielerdaten(I).RealeseHandles()
            Next
        End If
        For i = 0 To KOAnzeigeTexturen.Length - 1
            If KOAnzeigeTexturen(i) IsNot Nothing Then
                KOAnzeigeTexturen(i).Dispose()
                KOAnzeigeTexturen(i) = Nothing
            End If
        Next
        ReDim ObjektKartenauswahlMenue.ArmeeBanner(-1)
        ReDim ObjektKartenauswahlMenue.Armeen(-1)
        If EinheitenCheckboxen IsNot Nothing Then
            EinheitenCheckboxen.Dispose()
            EinheitenCheckboxen = Nothing
        End If
        If Not AlleSpielerVeraenderung Is Nothing Then
            AlleSpielerVeraenderung.RealeseHandles()
        End If
        Grafikengine.Grafikkarte.EvictManagedResources()
    End Sub
    ''' <summary>
    ''' Waehlt einen Zufaelligen CO aus!
    ''' </summary>
    ''' <param name="COS"></param>
    ''' <param name="Spieler"></param>
    ''' <param name="Spielmodus"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function SelectRandomCO(ByVal COS() As ObjektKO, ByVal Spieler As Integer, ByVal Spielmodus As CommanderWarsGameModi) As ObjektKO()
        If Hauptmenue.Connection IsNot Nothing Then
            If (Hauptmenue.Connection.Connected And Hauptmenue.Connection.Hosten) Or Not Hauptmenue.Connection.Connected Then
                Dim COList As String() = ObjektLadeklasse.GetRandomCOList(Spielmodus)
                For I2 = 0 To 1
                    If Not COS(I2) Is Nothing Then
                        If COS(I2).KOID = "ZUFALL" Then
                            Dim KOID As String = ""
                            If I2 = 0 Then
                                Do
                                    KOID = COList(Zufallszahl(0, COList.Length - 1))
                                Loop While KOID = "ZUFALL" Or Hauptmenue.User.LockedCOs.Contains(KOID)
                            Else
                                If COList.Length > 2 Then
                                    Do
                                        KOID = COList(Zufallszahl(0, COList.Length - 1))
                                    Loop While KOID = "ZUFALL" Or KOID = COS(0).KOID Or Hauptmenue.User.LockedCOs.Contains(KOID)
                                Else
                                    Do
                                        KOID = COList(Zufallszahl(0, COList.Length - 1))
                                    Loop While KOID = "ZUFALL" Or Hauptmenue.User.LockedCOs.Contains(KOID)
                                End If
                            End If
                            COS(I2) = ObjektLadeklasse.NewKO(KOID, Spieler)
                            Hauptmenue.NetzBefehlKartenauswahlSendenKO(Spieler, KOID, I2)
                        End If
                    End If
                Next
                Return COS
            Else 'Only Hosts can set the random CO
                Dim M As ObjektKartenauswahlMenue = Objektverwalter.Menue 'Wait for Random CO Transfer
                While M.KOS(Spieler, 0).KOID = "ZUFALL"
                    Threading.Thread.Sleep(ThreadSleepTime)
                End While
                If M.KOS(Spieler, 1) IsNot Nothing Then
                    While M.KOS(Spieler, 1).KOID = "ZUFALL"
                        Threading.Thread.Sleep(ThreadSleepTime)
                    End While
                End If
                COS(0) = M.KOS(Spieler, 0)
                COS(1) = M.KOS(Spieler, 1)
                Return COS
            End If
        Else
            Dim COList As String() = ObjektLadeklasse.GetRandomCOList(Spielmodus)
            For I2 = 0 To 1
                If Not COS(I2) Is Nothing Then
                    If COS(I2).KOID = "ZUFALL" Then
                        Dim KOID As String = ""
                        If I2 = 0 Then
                            Do
                                KOID = COList(Zufallszahl(0, COList.Length - 1))
                            Loop While KOID = "ZUFALL"
                        Else
                            If COList.Length > 2 Then
                                Do
                                    KOID = COList(Zufallszahl(0, COList.Length - 1))
                                Loop While KOID = "ZUFALL" Or KOID = COS(0).KOID
                            Else
                                Do
                                    KOID = COList(Zufallszahl(0, COList.Length - 1))
                                Loop While KOID = "ZUFALL"
                            End If
                        End If
                        COS(I2) = ObjektLadeklasse.NewKO(KOID, Spieler)
                        Hauptmenue.NetzBefehlKartenauswahlSendenKO(Spieler, KOID, I2)
                    End If
                End If
            Next
            Return COS
        End If
    End Function
#Region "Karten Auswahl"
    Public Sub KartenAuswahlErstellen()
        DirectoryPfade = New List(Of String)
        DirectoryPfade.Add(DataSettings.Resourcenpfad + "Maps\")
        For Each Directory In My.Computer.FileSystem.GetDirectories(DataSettings.Resourcenpfad + "Maps\", FileIO.SearchOption.SearchAllSubDirectories)
            If Not Directory.ToLower.EndsWith(".kamp") Then
                DirectoryPfade.Add(Directory + "\")
            End If
        Next
        Dim NUDValues(DirectoryPfade.Count - 1) As String
        For I = 0 To DirectoryPfade.Count - 1
            Dim D() As String = DirectoryPfade(I).Split("\")
            NUDValues(I) = D(D.Length - 2)
        Next

        For Each DDM In DropDownMenues
            Objekt2D.RemoveObjekt(DDM)
        Next
        If AllowMapBrowsing Then
            ReDim DropDownMenues(0)
            DropDownMenues(0) = New ObjektDropDownMenue(350, 20, NUDValues, New PointF(0, 0))
            DropDownMenues(0).SetItem(0)
        Else
            ReDim DropDownMenues(-1)
        End If
        'Objekte erschaffen!
        Array.Resize(Knoepfe, 0)

        NeuButton(30, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Zurueck", New PointF(0, 1))
        NeuButton(DataSettings.BildschirmBreite - 138, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Weiter", New PointF(1, 1))
        If AllowMapBrowsing Then
            If Not TypeOf Me Is ObjektNetzwerkMenue Then
                NeuButton(DataSettings.BildschirmBreite / 2 - 52, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Zufallskarte", New PointF(0.5#, 1))
            End If
            NeuButton(230, 20, DataSettings.Resourcenpfad + "Objects\Button.png", "Auswaehlen", New PointF(0, 0))

            'Und alle Karten
            ChangeDirectory(0)
        End If


    End Sub
    Public Sub ResetKartenAuswahl()
        For Each D In DropDownMenues
            D.RemoveHandles()
        Next
        ReDim MyBase.DropDownMenues(-1)
        LoeschenButton("Zufallskarte")
        LoeschenButton("Auswaehlen")
        If Objektverwalter.Minimap IsNot Nothing Then
            Objektverwalter.Minimap.Wirdgemalt = False
        End If
    End Sub
    Public Sub ChangeDirectory()
        If MessageBox.ShowOpenSaveDialogue(MessageBox.Modi.OrdnerDialog, Sprachconverter.Translate("Commander Wars"), DataSettings.Resourcenpfad + "Maps\", New String() {}) = Windows.Forms.DialogResult.OK Then
            ChangeDirectory(MessageBox.CurrentFile)
        End If
        ObjektMaus.Visible = True
    End Sub
    Public Sub ChangeDirectory(ByVal DirectoryStelle As Integer)
        AusgewaehlterDirectory = DirectoryStelle
        ChangeDirectory(DirectoryPfade(AusgewaehlterDirectory))
    End Sub
    Public Sub ChangeDirectory(ByVal Directory As String)
        Dim Karten As New Stack(Of String)
        UpdateDesc = True
        LoadMapTranslationsForFolder(Directory)
        SpielKarten = KartenLaden(Directory, Karten)
        Kartenname = Karten.ToArray
        If SpielKarten.Length > 0 Then
            ReDim KOS(SpielKarten(0).Spieler.Length - 1, 1)
            ReDim KartenAnzeigeModi(0)
        End If
        KartenAnzeigeModi(0) = -1
        'Welche Moeglichkeiten es fuer die Anzeige gibt.
        For I = 0 To SpielKarten.Length - 1
            If KartenAnzeigeModi.Contains(SpielKarten(I).Spieler.Length - 1) = False Then
                Array.Resize(KartenAnzeigeModi, KartenAnzeigeModi.Length + 1)
                KartenAnzeigeModi(KartenAnzeigeModi.Length - 1) = SpielKarten(I).Spieler.Length - 1
            End If
        Next
        Array.Sort(KartenAnzeigeModi)
        Dim I2 As Integer = Math.DivRem(DataSettings.BildschirmHoehe - 120, 21, 0)
        ReDim AngezeigteKarten(I2 - 1)
        ReDim KartenNamen(I2 - 1)
        MomentanerSpieler = 0
        MomentaneKarte = 0
        MomentanerAnzeigeModus = 0
        KartenStartIndex = 0
        LoeschenButton("Hoch")
        LoeschenButton("Runter")
        'Wir holen uns einmal die Breiten der Spieler Texturen
        ReDim SpielerZahlAnzeigeBreiten(KartenAnzeigeModi.Length - 1)
        Grafikengine.Sprite.Transform = Matrix.Identity
        For I = 0 To KartenAnzeigeModi.Length - 1
            Dim T As String = KartenAnzeigeModi(I).ToString
            If KartenAnzeigeModi(I) < 0 Then T = Sprachconverter.Translate("Alle")
            SpielerZahlAnzeigeBreiten(I) = Text.GetSchriftart.MeasureString(Grafikengine.Sprite, T, DrawTextFormat.None, Color.White).Width
        Next
        SpielerZahlAnzeigeHoehe = Text.GetSchriftart.MeasureString(Grafikengine.Sprite, "A", DrawTextFormat.None, Color.White).Height
        KleinerText = New ObjektText(New String() {}, 0, 0, Nothing, Schriftengine.Schriftarten.Arial_Unicode_MS, 8, FontStyle.Regular)

        KartenauswahlAktualiesieren()

        If SpielKarten.Length > 0 Then
            Objektverwalter.Minimap = New ObjektMinimap(SpielKarten(0), New Point(400, 200))
        End If
    End Sub
    ''' <summary>
    ''' Wir finden heraus welche Karte wir ausgewaehlt haben
    ''' </summary>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Private Sub GetMomentaneKarte(ByVal X As Integer, ByVal Y As Integer)
        'If My.Computer.Keyboard.AltKeyDown Then
        '    Console.WriteLine("OK")
        'End If                   'Ich glaube das lass ich besser nochmal stehen, falls man mal wieder was aendern will. zum Beispiel die Fixen Randwerte mit 12 und 300 aendern, die ich allein auf diese Weise mit dem Debugger geraten habe, ohne zu wissen wie gross die denn auf den Bildschirm gemalt werden.
        If X > 300 Then Exit Sub 'Hier mach ich feste Werte, weil ich nicht weiss, wie gross diese Items der Liste sind.
        If X < 12 Then Exit Sub 'Also ein Dutzend sollte man mindestens abstand vom Rand haben.
        Dim AlteKarte As Integer = MomentaneKarte
        Dim KartenlisteMax As Integer = 44 'Diese Variable soll angeben, wieviele Karten auf dem Bildschirm angezeigt werden koennen. Also waere nur Eine Karte 1 (obwohl sie natuerlich index 0 hat)
        'Auf meinem Bildschirm kann ich 44 sehen. Nach einer kurzen rechnung, komme ich darauf, dass bei mir 66 Pixel unten verschluckt werden. Dieser Wert ist jetzt natuerlich nur bis +/- 20 Genau. Ich nehm aber lieber ihn, da ich keinen anderen habe.
        'Demnach waere es dann wohl so aehnlich wie...
        'Momentmal, ich glaube die Kartennamen haben ja schon die Richtige Laenge..
        KartenlisteMax = KartenNamen.Length 'Solange in KartenNamen nur die Karten drinstehen, die Links angezeigt werden und nicht diejenigen, die es gibt.
        Y -= 61
        '989-923
        If Y < 0 Then
            MomentaneKarte = 0
        ElseIf Y > (21 * KartenlisteMax) - 1 + 100 Then '483 Then  ???
            If Kartenname.Length > 0 Then
                If KartenNamen(KartenNamen.Length - 1) = Nothing Then
                    For I = 0 To KartenNamen.Length - 1
                        If KartenNamen(I) = Nothing Then
                            MomentaneKarte = I - 1
                            Exit For
                        End If
                    Next
                Else
                    MomentaneKarte = KartenNamen.Length - 1
                End If
            End If
        Else
            MomentaneKarte = Math.DivRem(Y, 21, 0)
            If MomentaneKarte >= KartenNamen.Length Then MomentaneKarte = KartenNamen.Length - 1
            If KartenNamen.Length > 0 Then
                If KartenNamen(MomentaneKarte) = Nothing Then
                    For I = 0 To MomentaneKarte
                        If KartenNamen(I) = Nothing Then
                            MomentaneKarte = I - 1
                            Exit For
                        End If
                    Next
                End If
            End If
        End If
        If Not MomentaneKarte = AlteKarte Then
            MinimapAktualisieren()
        End If
    End Sub
    ''' <summary>
    ''' Falls wir eine andere Karte anzeigen muessen wird hier eine neue Minimap erstellt
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub MinimapAktualisieren()
        If Objektverwalter.Minimap IsNot Nothing Then
            If AngezeigteKarten.Length > 0 Then
                For I = 0 To SpielKarten(AngezeigteKarten(MomentaneKarte)).Spieler.Length - 1
                    If SpielKarten(AngezeigteKarten(MomentaneKarte)).Spieler(I).Farbe.A = 0 Then
                        If I = 0 Then
                            SpielKarten(AngezeigteKarten(MomentaneKarte)).Spieler(I).Farbe = Hauptmenue.SpielerNeutral
                        Else
                            Dim I2 As Integer = I - 1
                            While I2 >= Hauptmenue.AlleFarbtabellen.Length
                                I2 -= Hauptmenue.AlleFarbtabellen.Length
                            End While
                            SpielKarten(AngezeigteKarten(MomentaneKarte)).Spieler(I).Farbe = Hauptmenue.AlleFarbtabellen(I2)
                        End If
                    End If
                Next



                Objektverwalter.Minimap.Wirdgemalt = True
                Objektverwalter.Minimap = New ObjektMinimap(ObjektMinimap.Texturen, ObjektMinimap.Beschreibung, Objektverwalter.Minimap.SpielerTextur, ObjektMinimap.NeutraleTexturen, SpielKarten(AngezeigteKarten(MomentaneKarte)), Objektverwalter.Minimap.P)

                Objektverwalter.Minimap.Spielfeld.CreateStartArea()
                'Wir schauen mal welche Gebaeude es gibt.
                ReDim GebaeudeZahl(10)
                For I = 0 To GebaeudeZahl.Length - 1
                    Select Case I
                        Case 0
                            GebaeudeZahl(0).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("STADT")
                        Case 1
                            GebaeudeZahl(1).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("BASIS")
                        Case 2
                            GebaeudeZahl(2).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("WERFT")
                        Case 3
                            GebaeudeZahl(3).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("FLUGHAFEN")
                        Case 4
                            GebaeudeZahl(4).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("PIPESTATION")
                        Case 5
                            GebaeudeZahl(5).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("LABOR")
                        Case 6
                            GebaeudeZahl(6).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("HQ")
                        Case 7
                            GebaeudeZahl(7).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("TURM")
                        Case 8
                            GebaeudeZahl(8).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("MINE")
                        Case 9
                            GebaeudeZahl(9).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("RAKETENSILO+RAKETE")
                        Case 10
                            GebaeudeZahl(10).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("RADAR")
                    End Select
                Next

                Dim S As ObjektSpielfeld = SpielKarten(AngezeigteKarten(MomentaneKarte))
                For I = 0 To S.Landschaften.GetLength(2) - 1
                    For X = 0 To S.Breite - 1
                        For Y = 0 To S.Hoehe - 1
                            If Not S.Landschaften(X, Y, I).Hidden Then
                                Dim G As ObjektGebaeude = S.Landschaften(X, Y, I).Gebaeude
                                If Not G Is Nothing Then
                                    Select Case G.GebaeudeID
                                        Case "STADT"
                                            GebaeudeZahl(0).X += 1
                                        Case "BASIS"
                                            GebaeudeZahl(1).X += 1
                                        Case "WERFT"
                                            GebaeudeZahl(2).X += 1
                                        Case "FLUGHAFEN"
                                            GebaeudeZahl(3).X += 1
                                        Case "PIPESTATION"
                                            GebaeudeZahl(4).X += 1
                                        Case "LABOR"
                                            GebaeudeZahl(5).X += 1
                                        Case "HQ"
                                            GebaeudeZahl(6).X += 1
                                        Case "TURM"
                                            GebaeudeZahl(7).X += 1
                                        Case "MINE"
                                            GebaeudeZahl(8).X += 1
                                        Case "RAKETENSILO+RAKETE"
                                            GebaeudeZahl(9).X += 1
                                        Case "RADAR"
                                            GebaeudeZahl(10).X += 1
                                    End Select
                                End If
                            End If
                        Next
                    Next
                Next
            End If
        End If
    End Sub
    Private Sub KartenAnzeigeAuswaehlen(ByVal Steps As Integer)
        If Steps > 0 Then
            For I = 1 To Steps
                MomentaneKarte += 1
                If MomentaneKarte > KartenNamen.Length - 1 Then
                    Dim Aenderung As Integer = KartenNamen.Length - 1

                    If KartenStartIndex + KartenNamen.Length - 1 + Aenderung > Kartenname.Length - 1 Then
                        KartenStartIndex = Kartenname.Length - KartenNamen.Length
                        Aenderung = Kartenname.Length - MomentaneKarte - KartenStartIndex + 1
                    Else
                        KartenStartIndex += KartenNamen.Length - 1
                    End If
                    MomentaneKarte -= Aenderung
                    KartenauswahlAktualiesieren()
                ElseIf KartenNamen(MomentaneKarte) = "" Then
                    MomentaneKarte -= 1
                End If
            Next
            MinimapAktualisieren()
        ElseIf Steps < 0 Then
            For I = -1 To Steps Step -1
                MomentaneKarte -= 1
                If MomentaneKarte < 0 Then
                    MomentaneKarte = 0
                    KartenStartIndex -= KartenNamen.Length - 1
                    If KartenStartIndex < 0 Then
                        KartenStartIndex = 0
                    End If
                    KartenauswahlAktualiesieren()
                End If
                MinimapAktualisieren()
            Next
        End If
    End Sub
    Public Sub KartenRunterSuchen(ByVal Richtung As Integer)
        If Richtung > 0 Then
            KartenStartIndex += KartenNamen.Length - 1
            If KartenStartIndex + KartenNamen.Length - 1 > Kartenname.Length - 1 Then
                KartenStartIndex = Kartenname.Length - KartenNamen.Length
            End If
            KartenauswahlAktualiesieren()
        ElseIf Richtung < 0 Then
            KartenStartIndex -= (KartenNamen.Length - 1)
            If KartenStartIndex < 0 Then KartenStartIndex = 0
            KartenauswahlAktualiesieren()
        End If
    End Sub
    ''' <summary>
    ''' Wir waehlen die Karten durch.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KartenauswahlAktualiesieren()
        If AngezeigteKarten.Count > 0 Then
            Dim AktKarte As Integer = AngezeigteKarten(MomentaneKarte)
            Dim I2 As Integer = Math.DivRem(DataSettings.BildschirmHoehe - 120, 21, 0)
            Dim MaxMaps As Integer = 0
            For I = 0 To SpielKarten.Length - 1
                If IsAnzeigeKarte(I) Then
                    MaxMaps += 1
                End If
            Next
            If I2 > MaxMaps Then
                I2 = MaxMaps
            End If

            ReDim AngezeigteKarten(I2 - 1)
            ReDim KartenNamen(I2 - 1)
            MomentaneKarte = 0
            If AngezeigteKarten.Length > 0 Then
                AngezeigteKarten(MomentaneKarte) = AktKarte
                KartenNamen(MomentaneKarte) = SpielKarten(AktKarte).Kartenname
            End If

            CalculateStartIndex()
            For I = 0 To KartenNamen.Length - 1
                KartenNamen(I) = ""
                AngezeigteKarten(I) = -1
            Next

            Dim MomKarte As Integer = 0
            For I2 = KartenStartIndex To SpielKarten.Length - 1
                If IsAnzeigeKarte(I2) Then
                    KartenNamen(MomKarte) = SpielKarten(I2).Kartenname
                    AngezeigteKarten(MomKarte) = I2
                    MomKarte += 1
                End If
                If MomKarte > AngezeigteKarten.Length - 1 Then Exit For
            Next
            For I = 0 To AngezeigteKarten.Length - 1
                If AngezeigteKarten(I) < 0 Then
                    Array.Resize(AngezeigteKarten, I)
                    Exit For
                End If
            Next
            MinimapAktualisieren()
        End If
    End Sub
    Private Sub CalculateStartIndex()
        If KartenStartIndex < 0 Then KartenStartIndex = 0
        If KartenStartIndex > 0 Then
            Dim MaxKartenZahl As Integer = KartenNamen.Length
            Dim MomZahl As Integer = 0
            For I = KartenStartIndex To SpielKarten.Length - 1
                If IsAnzeigeKarte(I) Then
                    MomZahl += 1
                End If
                If MomZahl >= MaxKartenZahl Then
                    MomZahl = MaxKartenZahl
                    Exit For
                End If
            Next
            If ExistiertButton("Hoch") = False Then
                NeuButton(30, 20, DataSettings.Resourcenpfad + "Objects\Button.png", "Hoch", New PointF())
            End If
            If ExistiertButton("Runter") = False Then
                NeuButton(30, DataSettings.BildschirmHoehe - 55, DataSettings.Resourcenpfad + "Objects\Button.png", "Runter", New PointF(0, 1))
            End If
            If MomZahl < MaxKartenZahl Then
                MomZahl = 0
                For I = SpielKarten.Length - 1 To 0 Step -1
                    If IsAnzeigeKarte(I) Then
                        MomZahl += 1
                    End If
                    If MomZahl >= MaxKartenZahl Then
                        MomZahl = MaxKartenZahl
                        KartenStartIndex = I
                        LoeschenButton("Runter")
                        Exit Sub
                    End If
                Next
                'Es sind zu wenig Karten seltsam Startindex=0
                KartenStartIndex = 0
            ElseIf SpielKarten.Length - MomZahl = KartenStartIndex Then
                LoeschenButton("Runter")
            End If
        ElseIf KartenStartIndex = 0 Then
            LoeschenButton("Hoch")
            If GetKartenZahl() > AngezeigteKarten.Length Then
                If ExistiertButton("Runter") = False Then
                    NeuButton(30, DataSettings.BildschirmHoehe - 55, DataSettings.Resourcenpfad + "Objects\Button.png", "Runter", New PointF(0, 1))
                End If
            End If
        Else
        End If
    End Sub
    Private Sub KarteFestlegen(ByVal X As Integer, ByVal Y As Integer)
        If KartenNamen.Count > 0 Then
            If X > 300 Then 'Hier mach ich feste Werte, weil ich nicht weiss, wie gross diese Items der Liste sind.
                AndereAnzeigeKarten(X, Y)
                Exit Sub
            End If
            If X < 12 Then Exit Sub 'Also ein Dutzend sollte man mindestens abstand vom Rand haben.
            Dim AlteKarte As Integer = MomentaneKarte
            Dim KartenlisteMax As Integer = 44 'Diese Variable soll angeben, wieviele Karten auf dem Bildschirm angezeigt werden koennen. Also waere nur Eine Karte 1 (obwohl sie natuerlich index 0 hat)
            'Auf meinem Bildschirm kann ich 44 sehen. Nach einer kurzen rechnung, komme ich darauf, dass bei mir 66 Pixel unten verschluckt werden. Dieser Wert ist jetzt natuerlich nur bis +/- 20 Genau. Ich nehm aber lieber ihn, da ich keinen anderen habe.
            'Demnach waere es dann wohl so aehnlich wie...
            'Momentmal, ich glaube die Kartennamen haben ja schon die Richtige Laenge..
            KartenlisteMax = KartenNamen.Length 'Solange in KartenNamen nur die Karten drinstehen, die Links angezeigt werden und nicht diejenigen, die es gibt.
            Y -= 61
            '989-923
            If Y < 0 Then
                'wir sind oben raus
            ElseIf Y > (21 * KartenlisteMax) - 1 + 100 Then '483 Then  ???
                'Wir sind unten raus
            Else
                Dim K As Integer = Math.DivRem(Y, 21, 0)
                If K >= KartenNamen.Length Then K = KartenNamen.Length - 1
                If KartenNamen(K) = Nothing Then
                    'Da ist keine Karte
                Else
                    'Da ist eine KArte die nehmen wir
                    Dim M As ObjektKartenauswahlMenue = Objektverwalter.Menue
                    KarteFestlegen(False)
                End If
            End If
        End If
    End Sub
    Private Sub AndereAnzeigeKarten(ByVal X As Integer, ByVal Y As Integer)
        Dim Startpunkt As Point = New Point(DataSettings.BildschirmBreite - 20 - 16, 10)
        For I = 0 To SpielerZahlAnzeigeBreiten.Length - 1
            Startpunkt.X += (-12 - SpielerZahlAnzeigeBreiten(I))
        Next
        Startpunkt.X += 20
        Startpunkt.Y += 20 - SpielerZahlAnzeigeHoehe / 2
        For I = 0 To SpielerZahlAnzeigeBreiten.Length - 1
            Dim Rechteck As New Rectangle(Startpunkt.X, Startpunkt.Y, SpielerZahlAnzeigeBreiten(I), SpielerZahlAnzeigeHoehe)
            If Rechteck.Contains(X, Y) Then
                ChangeAnzeigeKartenModus(I)
                Exit Sub
            End If
            Startpunkt.X += 12 + SpielerZahlAnzeigeBreiten(I)
        Next
    End Sub
    ''' <summary>
    ''' Wir haben uns auf eine Karte geinigt und muessen jetzt die Spieler erstellen
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KarteFestlegen(ByVal OhneWeiter As Boolean)


        If TypeOf Me Is ObjektNetzwerkMenue Then
            Dim M As ObjektNetzwerkMenue = Me
            If M.Host = False Then
                M.btnHosten()
                Exit Sub
            End If
        End If
        LoeschenButton("Runter")
        LoeschenButton("Hoch")
        Dim Karte As Integer = AngezeigteKarten(MomentaneKarte)
        If Not OhneWeiter Or Not Objektverwalter.Minimap.Wirdgemalt Then
            Karte = AngezeigteKarten(MomentaneKarte)
            FestlegenDerKarte(Karte)
        End If
        'vorlaeufig zum Landkartenauswahlmenuesystem wechseln
        If Kartenname(Karte).EndsWith("Startkarte.map") Then
            If My.Computer.FileSystem.FileExists(Kartenname(Karte).Replace("Startkarte.map", "Landkarte.ini")) Then
                Hauptmenue.IniLandkartenMenue(Kartenname(Karte).Replace("Startkarte.map", "Landkarte.ini"), True)
                Exit Sub
            End If
        ElseIf Overworld Is Nothing Then
            Dim Landini As String = Kartenname(Karte).Remove(Kartenname(Karte).LastIndexOf("\") + 1)
            Landini += "Landkarte.ini"
            If My.Computer.FileSystem.FileExists(Landini) Then
                Hauptmenue.IniLandkartenMenue(Landini, True)
                Exit Sub
            End If
        End If

        'Vielleicht sollte ja schon was vorgegeben sein.
        Dim KOAuswahlKOS() As ObjektLadebildschirm.KOAuswahl = {}
        Dim EinKOProArmee As Boolean = False
        If My.Computer.FileSystem.FileExists(Kartenname(Karte).Replace(".map", ".ini")) Then
            'Console.WriteLine("Eine vordefinierte Karte wird geladen")
            Dim ScriptDat As String = ""
            If KIStufen.Length = 0 Then 'Well not a nice Variant to solve this bug :( 
                Karte = AngezeigteKarten(MomentaneKarte)
                FestlegenDerKarte(Karte)
            End If
            DialogTextSprachKonverter.Reset()
            Dim SofortStart As Boolean = False
            Dim NeuerModus As Boolean = False
            Dim strR As New IO.StreamReader(Kartenname(Karte).Replace(".map", ".ini"), Hauptmenue.Codierung)
            Regeln = SpielKarten(Karte).Regeln
            If Regeln.SitutionsSitzung IsNot Nothing Then Regeln.SitutionsSitzung.Clear()
            Dim NameSet As Boolean = False
            While Not strR.EndOfStream
                Dim z As String = strR.ReadLine
                z = z.Trim
                If z = "" Then Continue While 'Leerzeilen ignorieren
                If z.StartsWith("'") Then Continue While 'Kommentare werden ebenfalls ignoriert. Man kann allerdings so nicht hinter eine Befehlszeile einen kommentar setzten, so wie hier :)
                If Not NameSet Then
                    If z.StartsWith("Name:") Then SpielKarten(MomentaneKarte).Kartenname = z.Remove(0, z.IndexOf(":") + 1)
                    Dim Languages() As String = [Enum].GetNames(Sprachen.English.GetType)
                    If z.ToLower.StartsWith(Languages(DataSettings.Sprache).ToLower + ":") Then
                        NameSet = True
                        SpielKarten(MomentaneKarte).Kartenname = z.Remove(0, z.IndexOf(":") + 1)
                    End If
                End If
                If z.StartsWith("Desc:") Then SpielKarten(MomentaneKarte).Beschreibung = z.Remove(0, z.IndexOf(":") + 1)
                If z.StartsWith("Script:") Then ScriptDat = z.Remove(0, z.IndexOf(":") + 1)
                If z.StartsWith("NaechsteKarte:") Then
                    Dim unnoetiges As String = DataSettings.Resourcenpfad + "Maps\"
                    Dim Pfad As String = Kartenname(Karte)
                    Pfad = Pfad.Remove(0, unnoetiges.Length)
                    If Pfad.Contains("\") Then
                        Pfad = Pfad.Remove(Pfad.LastIndexOf("\") + 1)
                    Else
                        'Wir sind in keinem Unterordner und alles ist in Ordnung.
                        Pfad = ""
                    End If
                    Dim Maps() As String = z.Remove(0, z.IndexOf(":") + 1).Split("|")
                    For I = 0 To Maps.Length - 1
                        If I < Maps.Length - 1 Then
                            SpielKarten(MomentaneKarte).NaechsteKarte += Pfad + Maps(I) + "|"
                        Else
                            SpielKarten(MomentaneKarte).NaechsteKarte += Pfad + Maps(I)
                        End If
                    Next
                End If
                'Set the Startplayer
                If z.ToLower.StartsWith("startspieler=") Then
                    Regeln.Startspieler = z.Split("=")(1)
                End If

                If z.ToLower.StartsWith("koproarmee|") Then
                    EinKOProArmee = z.Split("|")(1)
                    Continue While
                End If
                If z.StartsWith("KO|") Then 'Ein KO soll festgelegt werden.
                    Dim s() As String = z.Split("|")
                    If s.Length > 3 Then
                        If s(3) = "-" Then
                            KOS(s(1), s(2)) = Nothing 'Hier soll es keinen KO geben. geht das so oder ist Nothing nicht der richtige Befehl?
                        ElseIf s.Length > 4 Then
                            'Jetzt sollten wir irgendwie machen das man den KO auswaehlen kann
                            'Jetzt nehmen wir einfach den ersten
                            Array.Resize(KOAuswahlKOS, KOAuswahlKOS.Length + 1)
                            Dim KOIDS(s.Length - 4) As Integer
                            For I = 3 To s.Length - 1
                                For I2 = 0 To Objektverwalter.GetKOLength() - 1
                                    If Objektverwalter.GetKO(I2).KOID = s(I).ToUpper Then
                                        KOIDS(I - 3) = I2
                                        Exit For
                                    End If
                                Next
                            Next
                            KOAuswahlKOS(KOAuswahlKOS.Length - 1) = New ObjektLadebildschirm.KOAuswahl(KOIDS, s(1), s(2))
                            KOS(s(1), s(2)) = ObjektLadeklasse.NewKO(s(3), s(1))
                        Else
                            KOS(s(1), s(2)) = ObjektLadeklasse.NewKO(s(3), s(1))
                        End If
                    Else
                        'Jetzt sollte ein Auswahl-Bildschirm erscheinen, wo wir einen KO-Festlegen koennen.
                        KOS(s(1), s(2)) = ObjektLadeklasse.NewKO(s(3), s(1))
                    End If
                End If
                If z.StartsWith("Team|") Then
                    Dim s() As String = z.Split("|")
                    Teams(s(1)) = s(2)
                End If
                If z.StartsWith("KI|") Then
                    Dim s() As String = z.Split("|")
                    KIStufen(s(1)) = s(2)
                End If
                If z.StartsWith("Farbe|") Then
                    Dim s() As String = z.Split("|")
                    If s(2).EndsWith(".bmp") Then
                        Farbtabellen(s(1)) = Hauptmenue.CStringColor(s(2))
                    Else
                        Farbtabellen(s(1)) = Color.FromArgb(CInt(s(2)))
                    End If
                End If
                If z.StartsWith("StartGeld|") Then
                    Dim s() As String = z.Split("|")
                    Startfonds(s(1)) = s(2)
                End If
                If z.ToLower.StartsWith("FondsPS|".ToLower) Then
                    Dim s() As String = z.Split("|")
                    FondsproStadt(s(1)) = s(2)
                End If
                If z.ToLower.StartsWith("FondsPF|".ToLower) Then
                    Dim s() As String = z.Split("|")
                    FondsproFabrik(s(1)) = s(2)
                End If

                If z.StartsWith("Bauliste|") Then
                    Dim s As String() = z.Split("|")
                    Dim Bauliste As Baulisten = CInt(s(2))
                    Baulisten(s(1)) = New Bauliste(ObjektLadeklasse.GetBauliste(Bauliste))
                    If s(1) = 0 Then
                        For I = 1 To Baulisten.Length - 1
                            Baulisten(I) = New Bauliste(ObjektLadeklasse.GetBauliste(Bauliste))
                        Next
                    Else
                        Baulisten(s(1)) = New Bauliste(ObjektLadeklasse.GetBauliste(Bauliste))
                    End If
                End If
                'Wir setzen die Bauprioriaeten
                If z.ToLower.StartsWith("bauprioritaeten|") Then
                    Dim s As String() = z.Split("|")
                    If s(1) = 0 Then
                        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                            SpielerBauprioritaeten(I) = New KIGenerellerSuperBau.PrioritaetsBau(s(2), s(3), s(4), s(5), s(6), s(7), s(8), s(9), s(10), False)
                        Next
                    Else
                        SpielerBauprioritaeten(s(1)) = New KIGenerellerSuperBau.PrioritaetsBau(s(2), s(3), s(4), s(5), s(6), s(7), s(8), s(9), s(10), False)
                    End If
                End If

                'Alles mit den Regeln.
                If z.ToLower.StartsWith("siegbedingungen|") Then
                    Dim s() As String = z.Split("|")
                    Select Case s(1).ToLower
                        Case "aus", "off"
                            Array.Resize(Regeln.StandartSiegbedingungen, 0)
                            ReDim Regeln.Besiegbar(-1, -1)
                        Case "hq sieg", "hqsieg"
                            Regeln.SiegBedingungHinzufuegen(ObjektRegeln.Siegbedingungen.KeineHQs, Teams.Length - 1)
                        Case "einheiten sieg", "einheitensieg"
                            Regeln.SiegBedingungHinzufuegen(ObjektRegeln.Siegbedingungen.KeineEinheiten, Teams.Length - 1)
                        Case "besetzung sieg", "besetzungsieg"
                            Regeln.SiegBedingungHinzufuegen(ObjektRegeln.Siegbedingungen.Besetzungen, Teams.Length - 1, s(2))
                        Case "zeit sieg", "zeitsieg"
                            Regeln.SiegBedingungHinzufuegen(ObjektRegeln.Siegbedingungen.Zeit, Teams.Length - 1, s(2))
                    End Select
                End If

                If z.ToLower.StartsWith("unbesiegbar|") Then
                    Regeln.AddUnbesiegbar(z.Split("|")(1))
                End If


                If z.ToLower = "SofortStart=1".ToLower Then SofortStart = True
                If z.ToLower = "SofortStart=0".ToLower Then SofortStart = False

                If z.ToLower = "ZufallsWetter=1".ToLower Then Regeln.Zufallswetter = True
                If z.ToLower = "ZufallsWetter=0".ToLower Then Regeln.Zufallswetter = False

                If z.ToLower = "baublockade=1" Then Regeln.BauBlockade = True
                If z.ToLower = "baublockade=0" Then Regeln.BauBlockade = False



                If z.ToLower.StartsWith("teuerungsrate=") Then
                    Regeln.Teurungsrate = z.Split("=")(1)
                End If

                If z.ToLower.StartsWith("startwetter=") Then
                    Regeln.Standardwetter = z.Split("=")(1)
                End If

                If z.ToLower = "Kriegsnebel=0".ToLower Then Regeln.Nebel = Nebelarten.Aus
                If z.ToLower = "Kriegsnebel=1".ToLower Then Regeln.Nebel = Nebelarten.Nebel
                If z.ToLower = "Kriegsnebel=2".ToLower Then Regeln.Nebel = Nebelarten.Kriegsnebel

                If z.ToLower = "Luftschlacht=0".ToLower Then Regeln.Luftschlacht = False
                If z.ToLower = "Luftschlacht=1".ToLower Then Regeln.Luftschlacht = True

                If z.ToLower = "LevelModus=0".ToLower Or z.ToLower = "Promotion=0".ToLower Then Regeln.LevelModus = False
                If z.ToLower = "LevelModus=1".ToLower Or z.ToLower = "Promotion=1".ToLower Then Regeln.LevelModus = True

                If z.ToLower = "DoppelGabe=0".ToLower Then Regeln.DoppelGabe = False
                If z.ToLower = "DoppelGabe=1".ToLower Then Regeln.DoppelGabe = True

                If z.ToLower = "GebaeudeZerstoerung=0".ToLower Then Regeln.GebaeudeZerstoerung = False
                If z.ToLower = "GebaeudeZerstoerung=1".ToLower Then Regeln.GebaeudeZerstoerung = True

                If z.ToLower = "Luck=0".ToLower Then Regeln.NoLuck = True
                If z.ToLower = "Luck=1".ToLower Then Regeln.GebaeudeZerstoerung = False


                If z.ToLower.StartsWith("siegbedingung=") Then
                    Regeln.Siegbedingung = z.Split("=")(1)
                End If

                If z.ToLower.StartsWith("TacticsDialog2:".ToLower) Then
                    z = z.Remove(0, z.IndexOf(":") + 1)
                    Dim s() As String = z.Split("|")
                    Dim Chat As String = ""
                    For I = 5 To s.Length - 2
                        Chat += s(I) + "|"
                    Next
                    Chat += s(s.Length - 1)
                    If Regeln.SitutionsSitzung Is Nothing Then Regeln.SitutionsSitzung = New List(Of ObjektScript.EreignisDialog)
                    Regeln.SitutionsSitzung.Add(New ObjektScript.EreignisDialog(Chat, s(0), s(1), CInt(s(2)), s(3), s(4)))
                End If

                If z.ToLower.StartsWith("Tactics%".ToLower) Then
                    Dim s() As String = z.Split("%")
                    DialogTextSprachKonverter.SprachKonvIni.AddEintrag(s(1), s(3), s(2))
                End If


                If z.ToLower.StartsWith("AltesKOSystem".ToLower) Then
                    Regeln.KOSystem = CInt(z.Split("=")(1))
                End If

                If z.ToLower.StartsWith("gamemode:") Then
                    Dim GM As Integer = 0
                    If IsNumeric(z.Remove(0, z.IndexOf(":") + 1)) Then
                        GM = CInt(z.Remove(0, z.IndexOf(":") + 1)) - 1
                    Else
                        GM = [Enum].Parse(CommanderWarsGameModi.AdvanceWarsDC.GetType, z.Remove(0, z.IndexOf(":") + 1))
                    End If
                    If GM >= 0 Then
                        If GM <> DataSettings.CommanderWarsGameModus Then
                            DataSettings.CommanderWarsGameModus = GM
                            SpielKarten(AngezeigteKarten(MomentaneKarte)).CommanderWarsModus = GM
                            NeuerModus = True
                        End If
                    End If
                End If
            End While
            If NeuerModus Then
                Objektverwalter.LoadNewGameModus(DataSettings.TerrainStyle)
            End If
            strR.Dispose()
            SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln = Regeln
            'eventuell noch das Script laden...
            If Not ScriptDat = "" Then 'Offensichtlich gibt es was..
                ObjektScript.NeuScript(ScriptDat, False)
                'If IsNothing(M.SpielKarten(MomentaneKarte).Scripts) Then
                '    ReDim M.SpielKarten(MomentaneKarte).Scripts(0)
                'Else
                '    Array.Resize(M.SpielKarten(MomentaneKarte).Scripts, M.SpielKarten(MomentaneKarte).Scripts.Length + 1)
                'End If
                SpielKarten(AngezeigteKarten(MomentaneKarte)).Scripts = ObjektScript.Scripts
            End If
            '... oder gleich das ganze Auswahlmenue ueberspringen...
            If SofortStart Then 'Das muss man noch etwas verfeinern, aber das Problem ist Spielstart() ist sowohl, wie der Name sagt, Spielstart, als auch das Ende des Regelmenues, also werden dort CheckBoxen und so geprueft, deshalb dieser umstaendliche Weg.
                If KOAuswahlKOS.Length > 0 Then
                    Spielstart(KOAuswahlKOS, EinKOProArmee)
                Else
                    Spielstart()
                End If
            ElseIf Not OhneWeiter Then
                Weiter()
            End If
        ElseIf Not OhneWeiter Then
            Weiter()

        End If
    End Sub
    Protected Sub FestlegenDerKarte(ByVal Karte As Integer)
        If Objektverwalter.Minimap IsNot Nothing Then 'Due to Network Games
            Objektverwalter.Minimap.Wirdgemalt = False
        End If
        MomentanerSpieler = 1
        MomentaneKarte = 0
        AngezeigteKarten(MomentaneKarte) = Karte

        AnzahlderSpieler = SpielKarten(Karte).Spieler.Length
        ReDim KOS(AnzahlderSpieler - 1, 1)
        ReDim Farbtabellen(AnzahlderSpieler - 1)
        ReDim Teams(AnzahlderSpieler - 1)
        ReDim FondsproStadt(AnzahlderSpieler - 1)
        ReDim FondsproFabrik(AnzahlderSpieler - 1)
        ReDim Startfonds(AnzahlderSpieler - 1)
        ReDim Baulisten(AnzahlderSpieler - 1)
        ReDim KIStufen(AnzahlderSpieler - 1)
        ReDim SpielerBauprioritaeten(AnzahlderSpieler - 1)
        MomentaneKartenName = Kartenname(Karte)
        KOS(0, 0) = ObjektLadeklasse.NewKO("Andy", 1)
        Farbtabellen(0) = Hauptmenue.SpielerNeutral
        Teams(0) = "q"
        Dim TeamZahl As Integer = [Enum].GetNames(Objektverwalter.ABC.A.GetType).Length
        For I = 1 To AnzahlderSpieler - 1
            Farbtabellen(I) = SpielKarten(Karte).Spieler(I).Farbe
            Dim Z As Integer = I
            While Z > TeamZahl
                Z -= TeamZahl
            End While
            Teams(I) = SpielKarten(Karte).Spieler(I).Team.ToString
            FondsproStadt(I) = SpielKarten(Karte).Spieler(I).FondsproStadt
            Startfonds(I) = SpielKarten(Karte).Spieler(I).Fonds
            FondsproFabrik(I) = SpielKarten(Karte).Spieler(I).Fabrikfonds
            KIStufen(I) = SpielKarten(Karte).Spieler(I).KIStufe
        Next
        ' 

        'Bevor noch irgendwelche alten Scripts hier rumliegen raeum ich sie am besten auf.
        ObjektScript.Reset()
    End Sub
    Public Function GetMomentaneKarte() As String
        If Kartenname.Length > 0 Then
            Return Kartenname(AngezeigteKarten(MomentaneKarte))
        Else
            Return ""
        End If
    End Function
    Public Function GetKartenname() As String
        If KartenNamen.Length > 0 Then
            Return KartenNamen(AngezeigteKarten(MomentaneKarte))
        Else
            Return ""
        End If
    End Function
#End Region
#Region "SpielerAuwahl"
    Protected Sub ResetSpielerAuswahl()
        If KIStufen.Length - 1 <> Spielernamen.Length Then
            ReDim Spielernamen(Spielerdaten.Length - 1)
        End If
        For I = 0 To Spielerdaten.Length - 1
            Spielernamen(I) = Spielerdaten(I).Labels(0).Text.Text(0)
            Spielerdaten(I).RealeseHandles()
        Next
        Array.Resize(Spielerdaten, 0)
        For I = 0 To DropDownMenues.Length - 1
            If Not DropDownMenues Is Nothing Then
                DropDownMenues(I).RemoveHandles()
            End If
        Next
        ReDim Labels(-1)
        ReDim DropDownMenues(-1)
        LoeschenButton("Spielerfarbe")
        LoeschenButton("KO Info")
        If Not AlleSpielerVeraenderung Is Nothing Then
            AlleSpielerVeraenderung.RealeseHandles()
            AlleSpielerVeraenderung = Nothing
        End If
        If Hauptmenue.Connection IsNot Nothing Then
            If Hauptmenue.Connection.Connected Then
                LoeschenButton("Bereit")
            Else
                LoeschenButton("Starten")
            End If
        Else
            LoeschenButton("Starten")
        End If
        bStartbereitShowButtons = False
        'Alle Panels loeschen
        For Each P In Panels
            P.RemoveHandles()
        Next
        ReDim Panels(-1)
    End Sub
    Public Sub SpielerAuswahlErstellen()
        If DropDownMenues.Length > 0 Then
            Objekt2D.RemoveObjekt(DropDownMenues(0))
        End If
        For I = 0 To Spielerdaten.Length - 1
            Spielerdaten(I).RealeseHandles()
        Next
        If Not AlleSpielerVeraenderung Is Nothing Then
            AlleSpielerVeraenderung.RealeseHandles()
        End If
        ReDim NUDS(-1)
        ReDim SUDS(-1)
        ReDim Labels(0)
        ReDim MultiValues(-1)
        ReDim CheckBoxen(-1)
        ReDim DropDownMenues(0)
        'Panel fuer die Einheiten CheckBoxen
        Dim PanelEinheitenMenue As New ObjektPanelEinheitenMenue(New Rectangle(XOffSetFuerKOUndPanels, 0, Hauptmenue.Rechteck.Width - XOffSetFuerKOUndPanels, 200), New PointF(0.5#, 0), 1, False)
        MyBase.NeuPanel(PanelEinheitenMenue)
        EinheitenCheckboxen = New ObjektEinheitenCheckbox(New ObjektSpieler(1, Farbtabellen(1), 0, Nothing, 0, "", "", Nothing, ObjektSpieler.KIStufen.Mensch, 0), New PointF(0.5#, 0), PanelEinheitenMenue, Math.DivRem(CInt(DataSettings.BildschirmBreite - XOffSetFuerKOUndPanels), CInt(Hauptmenue.Feldbreite * 5 / 2), 0), New Point(10, 10))
        PanelEinheitenMenue.SetEinheitenMenue(EinheitenCheckboxen)

        KOAnzeigeTexturenKaden(SpielKarten(MomentaneKarte).Spieler(1).Farbe)
        ArmeeFestlegen(0)
        MomentanerSpieler = 1
        'Die Values fuer alle



        'Nur voruebergehend will ich auch anders machen.

        'Panel erstellen und Objekte hinzufuegen!
        Dim SpielerPanel As New ObjektPanel2D(New Rectangle(XOffSetFuerKOUndPanels, 210, Hauptmenue.Rechteck.Width - XOffSetFuerKOUndPanels, Hauptmenue.Rechteck.Height - 210 - 150), New PointF(0.5#, 0.75#), 1, False)
        Array.Resize(Spielerdaten, AnzahlderSpieler - 1)
        For I = 1 To AnzahlderSpieler - 1
            Spielerdaten(I - 1) = New Spieler(I, Me, New Point(0, 60 + (I - 1) * 30), SpielerPanel)
        Next
        AlleSpielerVeraenderung = New AlleSpieler(1, Me, 10, SpielerPanel)
        Labels(0) = New ObjektLabel(10, 10, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Spieler"}, New Point(0, 0), 10, 0, New PointF(), SpielerPanel)
        DropDownMenues(0) = New ObjektDropDownMenue(60, 10, GetSpielerItems, New PointF(), True, SpielerPanel)
        MyBase.NeuPanel(SpielerPanel)

        'Spielerfarbe Button
        LoeschenButton("Zurueck")
        NeuButton(30, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Zurueck", New PointF(0, 1))
        AddButton(Hauptmenue.Rechteck.Width / 2 - 54, Hauptmenue.Rechteck.Height - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Spielerfarbe", New PointF(0.5#, 1))
        AddButton(30, Hauptmenue.Rechteck.Height - 60, DataSettings.Resourcenpfad + "Objects\Button.png", "KO Info", New PointF(0, 1))

        'Chatroom
        If Hauptmenue.Chatroom IsNot Nothing Then
            Hauptmenue.Chatroom.Top = False
            Hauptmenue.Chatroom.Chatmodus = Chat.Modus.CO_Screen
            Hauptmenue.Chatroom.CreateSubObjects()
        End If


        For I = 0 To Spielerdaten.Length - 1
            Spielerdaten(I).Update(Me)
        Next
        CheckButtonStarten()
    End Sub
    ''' <summary>
    ''' Gibt zurueck welche Spieler wir veraenden duerfen
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Protected Function GetSpielerItems() As String()
        Dim Items() As String = {}
        If Hauptmenue.Connection IsNot Nothing Then
            If Hauptmenue.Connection.Connected Then
                If Hauptmenue.Connection.Hosten Then
                    For I = 0 To Spielerdaten.Length - 1
                        Array.Resize(Items, Items.Length + 1)
                        Items(Items.Length - 1) = (I + 1).ToString
                    Next
                Else
                    For I = 0 To Spielerdaten.Length - 1
                        If Spielerdaten(I).GetKIStufe = ObjektSpieler.KIStufen.Mensch Then
                            Array.Resize(Items, Items.Length + 1)
                            Items(Items.Length - 1) = (I + 1).ToString
                        End If
                    Next
                End If
            Else
                Array.Resize(Items, AnzahlderSpieler - 1)
                For I = 0 To Items.Length - 1
                    Items(I) = (I + 1).ToString
                Next
            End If
        Else
            Array.Resize(Items, AnzahlderSpieler - 1)
            For I = 0 To Items.Length - 1
                Items(I) = (I + 1).ToString
            Next
        End If
        Return Items
    End Function
    ''' <summary>
    ''' Wir legen einen KO fest
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function CheckSpielerAuswahl(ByVal X As Integer, ByVal Y As Integer) As Boolean
        If KIStufen(MomentanerSpieler) <> ObjektSpieler.KIStufen.Passiv Then
            Dim Rechteck As New Rectangle(2, 62, 156, 48 + Math.DivRem(AnzahlderGemaltenKos, 3, 0) * 52)
            If Rechteck.Contains(X, Y) Then
                If X <= 51 And Y <= 111 Then
                    If IsNothing(KOS(MomentanerSpieler, 1)) = False Then
                        KOS(MomentanerSpieler, 1) = Nothing
                    Else
                        KOS(MomentanerSpieler, 0) = Nothing
                    End If
                Else
                    Dim StartzahlderKOs As Integer = IndexOfArmee(Armeen(AusgewaehlteArmee))
                    Dim StartRechteck = New Rectangle(Rechteck.X + 52, Rechteck.Y, 48, 48)
                    Dim I2 As Integer = 1
                    For I = 0 To AnzahlderGemaltenKos - 1
                        If StartRechteck.Contains(X, Y) Then
                            Dim KO As Integer = I + StartzahlderKOs
                            Dim Ende As Integer = KO
                            For I2 = ObjektKartenauswahlMenue.IndexOfArmee(ObjektKartenauswahlMenue.Armeen(AusgewaehlteArmee)) To Ende
                                If Hauptmenue.User.LockedCOColors.Contains(Objektverwalter.GetKO(I2).KOID) Then
                                    KO += 1
                                End If
                            Next
                            While Hauptmenue.User.LockedCOColors.Contains(Objektverwalter.GetKO(KO).KOID)
                                KO += 1
                                If KO >= Objektverwalter.GetKOLength Then
                                    KO = -1
                                    Exit While
                                End If
                            End While
                            If IsNothing(KOS(MomentanerSpieler, 0)) Or DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.AdvanceWarsDC Then
                                KOS(MomentanerSpieler, 0) = ObjektLadeklasse.NewKO(Objektverwalter.GetKO(KO).KOID, MomentanerSpieler)
                            ElseIf Not KOS(MomentanerSpieler, 0).KOID = Objektverwalter.GetKO(KO).KOID Or KOS(MomentanerSpieler, 0).KOID = "ZUFALL" Then
                                KOS(MomentanerSpieler, 1) = ObjektLadeklasse.NewKO(Objektverwalter.GetKO(KO).KOID, MomentanerSpieler)
                            End If
                            Exit For
                        End If
                        I2 += 1
                        StartRechteck.X += 52
                        If I2 > 2 Then
                            I2 = 0
                            StartRechteck.X = Rechteck.X
                            StartRechteck.Y += 52
                        End If
                    Next
                End If
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
    Private Function CheckKOInformationsAnzeige(ByVal X As Integer, ByVal Y As Integer) As Boolean
        Dim Rechteck As New Rectangle(2, 62, 156, 48 + Math.DivRem(AnzahlderGemaltenKos, 3, 0) * 52)
        If Rechteck.Contains(X, Y) Then
            If X <= 51 And Y <= 111 Then
            Else
                Dim StartzahlderKOs As Integer = IndexOfArmee(Armeen(AusgewaehlteArmee))
                Dim StartRechteck = New Rectangle(Rechteck.X + 52, Rechteck.Y, 48, 48)
                Dim I2 As Integer = 1
                For I = 0 To AnzahlderGemaltenKos - 1
                    If StartRechteck.Contains(X, Y) Then
                        If Objektverwalter.GetKO(StartzahlderKOs + I).KOID <> "ZUFALL" Then
                            KOInformation = New ObjektKOInformation(0, 0, StartzahlderKOs + I, New PointF)
                        End If
                        Exit For
                    End If
                    I2 += 1
                    StartRechteck.X += 52
                    If I2 > 2 Then
                        I2 = 0
                        StartRechteck.X = Rechteck.X
                        StartRechteck.Y += 52
                    End If
                Next
            End If
            Return True
        Else
            Return False
        End If
    End Function
    ''' <summary>
    ''' Wir schauen ob wir die KO'S einer anderen Armee anzeigen muessen.
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function CheckArmeeKlick(ByVal X As Integer, ByVal Y As Integer) As Boolean
        Dim Rechteck As New Rectangle(10, 0, 19 * ArmeeBanner.Length, 42)
        If Rechteck.Contains(X, Y) Then
            ArmeeFestlegen(Math.DivRem(X - Rechteck.X, 19, 0))
            Return True
        End If
        Return False
    End Function
    ''' <summary>
    ''' legt die Armee des Spielers fest
    ''' </summary>
    ''' <param name="Armee"></param>
    ''' <remarks></remarks>
    Private Sub ArmeeFestlegen(ByVal Armee As Integer)
        AusgewaehlteArmee = Armee
        AnzahlderGemaltenKos = LastIndexOfArmee(Armeen(AusgewaehlteArmee)) - IndexOfArmee(Armeen(AusgewaehlteArmee)) + 1
        Dim Ende As Integer = AnzahlderGemaltenKos
        For I = ObjektKartenauswahlMenue.IndexOfArmee(ObjektKartenauswahlMenue.Armeen(AusgewaehlteArmee)) To ObjektKartenauswahlMenue.IndexOfArmee(ObjektKartenauswahlMenue.Armeen(AusgewaehlteArmee)) + Ende - 1
            If Hauptmenue.User.LockedCOs.Contains(Objektverwalter.GetKO(I).KOID) Then
                AnzahlderGemaltenKos -= 1
            End If
        Next
    End Sub
    ''' <summary>
    ''' Wir schauen nach, von welchem KO wir die Informationen anzeigen muessen
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Private Sub GetKOCursorPosition(ByVal X As Integer, ByVal Y As Integer)
        Dim Startrechteck As New Rectangle(2, 62, 48, 48)
        Dim I2 As Integer = 0
        For I = 0 To AnzahlderGemaltenKos
            If Startrechteck.Contains(X, Y) Then
                If I = 0 Then
                    MomentanerKO = -1
                Else
                    MomentanerKO = I + IndexOfArmee(Armeen(AusgewaehlteArmee)) - 1
                    Dim Ende As Integer = MomentanerKO
                    For I2 = ObjektKartenauswahlMenue.IndexOfArmee(ObjektKartenauswahlMenue.Armeen(AusgewaehlteArmee)) To Ende
                        If Hauptmenue.User.LockedCOs.Contains(Objektverwalter.GetKO(I2).KOID) Then
                            MomentanerKO += 1
                        End If
                    Next
                    While Hauptmenue.User.LockedCOs.Contains(Objektverwalter.GetKO(MomentanerKO).KOID)
                        MomentanerKO += 1
                        If MomentanerKO >= Objektverwalter.GetKOLength Then
                            MomentanerKO = -1
                            Exit While
                        End If
                    End While
                End If
                KOCursor = New Point(Startrechteck.X, Startrechteck.Y)
                Exit For
            End If
            Startrechteck.X += 52
            I2 += 1
            If I2 > 2 Then
                I2 = 0
                Startrechteck.X = 2
                Startrechteck.Y += 52
            End If
            If I = AnzahlderGemaltenKos Then
                KOCursor = New Point(-50, -50)
            End If
        Next
    End Sub
    ''' <summary>
    ''' Gibt den ersten KO einer Armee in der Structure Liste zurueck
    ''' </summary>
    ''' <param name="Armee"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function IndexOfArmee(ByVal Armee As String)
        For I = 0 To Objektverwalter.GetKOLength() - 1
            If Objektverwalter.GetKO(I).Armee = Armee Then
                Return I
            End If
        Next
        Return 0
    End Function
    ''' <summary>
    ''' Gibt den letzten KO einer Armee in der Structure Liste zurueck
    ''' </summary>
    ''' <param name="Armee"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function LastIndexOfArmee(ByVal Armee As String)
        For I = Objektverwalter.GetKOLength() - 1 To 0 Step -1
            If Objektverwalter.GetKO(I).Armee = Armee Then
                Return I
            End If
        Next
        Return 0
    End Function


    ''' <summary>
    ''' Sendet die Spielerdaten an alle anderen.
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub SendPlayerInformation()
        If Hauptmenue.Connection IsNot Nothing Then
            If Hauptmenue.Connection.Connected And Hauptmenue.Connection.Hosten Then
                'Yes we're the Host no doubt about that.
                'Create a message or better one for every client right? Still less traffic than before
                Dim Clients As List(Of Integer) = Hauptmenue.Connection.GetServerClients()
                For i = 0 To Clients.Count - 1
                    Dim Nachricht As String = "Vorbereitung|Host" 'tell the Client it's a Host message :D from who else he should get a message
                    For player = 0 To Spielerdaten.Count - 1
                        Nachricht += "|"
                        Nachricht += (player + 1).ToString + "|" + GetPlayerName(player + 1) + "|" + Teams(player + 1) + "|"
                        If KOS(player + 1, 0) Is Nothing Then
                            Nachricht += "Nothing|Nothing"
                        ElseIf KOS(player + 1, 1) Is Nothing Then
                            Nachricht += KOS(player + 1, 0).KOID + "|"
                            Nachricht += "Nothing"
                        Else
                            Nachricht += KOS(player + 1, 0).KOID + "|"
                            Nachricht += KOS(player + 1, 1).KOID
                        End If
                        Nachricht += "|" + Farbtabellen(player + 1).ToArgb.ToString
                        'Send the AI
                        If KIStufen(player + 1) = ObjektSpieler.KIStufen.Passiv Then
                            If Spielerdaten(player).PlayerID = Clients(i) Then
                                'Surprise it's me
                                Nachricht += "|" + CInt(ObjektSpieler.KIStufen.Mensch).ToString
                            Else
                                'Not me :(
                                Nachricht += "|" + CInt(ObjektSpieler.KIStufen.Passiv).ToString
                            End If
                        ElseIf KIStufen(player + 1) = ObjektSpieler.KIStufen.Mensch Then
                            Nachricht += "|" + CInt(ObjektSpieler.KIStufen.Passiv).ToString
                        Else
                            Nachricht += "|" + CInt(KIStufen(player + 1)).ToString
                        End If
                        'Startfonds
                        Nachricht += "|" + Startfonds(player + 1).ToString
                        Nachricht += "|" + FondsproStadt(player + 1).ToString
                        Nachricht += "|" + FondsproFabrik(player + 1).ToString
                        'Baulisten senden
                        Nachricht += "|" + Baulisten(player + 1).ToString
                    Next
                    'Send the paket into the world ähm to the client
                    Hauptmenue.Connection.SendData(New NetworkPaket(Nachricht), Clients(i))
                Next
            ElseIf Hauptmenue.Connection.Connected And ErstesUpdateEmpfangen And SpielInizialiesiert And RuleRecieved And FirstWeiter Then
                Dim Nachricht As String = "Vorbereitung|Client"
                For i = 0 To Spielerdaten.Count - 1
                    'Client Jetzt noch die KO's und so senden wenn wir Client sind
                    If KIStufen(i + 1) = ObjektSpieler.KIStufen.Mensch Then
                        Nachricht += "|"
                        Nachricht += (i + 1).ToString + "|" + DataSettings.Autor + "|" + Teams(i + 1) + "|"
                        If KOS(i + 1, 0) Is Nothing Then
                            Nachricht += "Nothing|Nothing"
                        ElseIf KOS(i + 1, 1) Is Nothing Then
                            Nachricht += KOS(i + 1, 0).KOID + "|"
                            Nachricht += "Nothing"
                        Else
                            Nachricht += KOS(i + 1, 0).KOID + "|"
                            Nachricht += KOS(i + 1, 1).KOID
                        End If
                        Nachricht += "|" + Farbtabellen(i + 1).ToArgb.ToString
                    End If
                Next
                Hauptmenue.Connection.SendData(New NetworkPaket(Nachricht))
            End If
        End If
    End Sub
#Region "SpielerAnzeige und Veraenderung"
    Public Class Spieler
        ''' <summary>
        ''' 0=KI Stufe
        ''' 1=Teams
        ''' 2=Bauliste
        ''' 3=Spielerfarbe
        ''' </summary>
        ''' <remarks></remarks>
        Dim DDMS() As ObjektDropDownMenue = {}
        ''' <summary>
        ''' 0=Startfonds
        ''' 1=Fondspro Stadt
        ''' 2=Fabrikfonds
        ''' </summary>
        ''' <remarks></remarks>
        Dim NUDS() As ObjektNumericUpDown = {}
        Public Labels As New List(Of ObjektLabel)
        Public Spieler As Integer = 0
        Public PlayerID As Integer = 0
        Public ClientPlayer As Boolean = False
        Public Updated As Boolean = False
        Dim Position As Point
        Dim Netzzugriff As Boolean = False
        Dim Handler As ObjektPanel2D
        Public Sub New(ByVal Spieler As Integer, ByVal Menue As ObjektKartenauswahlMenue, ByVal Position As Point, ByVal Handler As ObjektPanel2D)
            Me.Position = Position
            Me.Spieler = Spieler
            Me.Handler = Handler
            ReDim NUDS(2)
            ReDim DDMS(3)
            Dim Werte() As String = [Enum].GetNames(ObjektSpieler.KIStufen.Mensch.GetType)
            If Hauptmenue.Connection IsNot Nothing Then
                If Hauptmenue.Connection.Connected Then
                    Array.Resize(Werte, Werte.Length - 1)
                Else
                    Array.Resize(Werte, Werte.Length - 2)
                End If
            Else
                Array.Resize(Werte, Werte.Length - 2)
            End If

            DDMS(1) = New ObjektDropDownMenue(210, Position.Y, Werte, New PointF, Netzzugriff, Handler)
            If Hauptmenue.Connection IsNot Nothing Then
                If Hauptmenue.Connection.Connected And Spieler <> 1 And Hauptmenue.Connection.Hosten Then
                    DDMS(1).SetItem(ObjektSpieler.KIStufen.Offen.ToString)
                    Menue.KIStufen(Spieler) = ObjektSpieler.KIStufen.Offen
                Else
                    DDMS(1).SetItem(Menue.KIStufen(Spieler).ToString)
                End If
            Else
                DDMS(1).SetItem(Menue.KIStufen(Spieler).ToString)
            End If


            NUDS(0) = New ObjektNumericUpDown(Menue.Startfonds(Spieler), 0, 99500, DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(320, Position.Y), 500, New PointF, , Handler)
            NUDS(1) = New ObjektNumericUpDown(Menue.FondsproStadt(Spieler), 500, 99500, DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(395, Position.Y), 500, New PointF, , Handler)
            NUDS(2) = New ObjektNumericUpDown(Menue.FondsproFabrik(Spieler), 500, 99500, DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(470, Position.Y), 500, New PointF, , Handler)
            DDMS(0) = New ObjektDropDownMenue(550, Position.Y, [Enum].GetNames(Objektverwalter.ABC.A.GetType), New PointF, Netzzugriff, Handler)
            DDMS(0).SetItem(Menue.Teams(Spieler))
            Dim Items As String() = New String() {Commander_Wars.Baulisten.AW.ToString, Commander_Wars.Baulisten.AW_2.ToString, Commander_Wars.Baulisten.AW_DS.ToString, Commander_Wars.Baulisten.AW_DC.ToString, Commander_Wars.Baulisten.CoW.ToString, Commander_Wars.Baulisten.CoW_2.ToString, _
                                                  Commander_Wars.Baulisten.Ind_1.ToString, Commander_Wars.Baulisten.Ind_2.ToString, Commander_Wars.Baulisten.Ind_3.ToString}
            DDMS(2) = New ObjektDropDownMenue(610, Position.Y, Items, New PointF, Netzzugriff, Handler)
            Select Case DataSettings.CommanderWarsGameModus
                Case CommanderWarsGameModi.AdvanceWars
                    DDMS(2).SetItem(Commander_Wars.Baulisten.AW.ToString)
                Case CommanderWarsGameModi.AdvanceWars2
                    DDMS(2).SetItem(Commander_Wars.Baulisten.AW_2.ToString)
                Case CommanderWarsGameModi.AdvanceWarsDS
                    DDMS(2).SetItem(Commander_Wars.Baulisten.AW_DS.ToString)
                Case CommanderWarsGameModi.AdvanceWarsDC
                    DDMS(2).SetItem(Commander_Wars.Baulisten.AW_DC.ToString)
                Case CommanderWarsGameModi.CommanderWars2
                    DDMS(2).SetItem(Commander_Wars.Baulisten.CoW_2.ToString)
                Case Else
                    DDMS(2).SetItem(Commander_Wars.Baulisten.CoW.ToString)
            End Select
            Dim C(Hauptmenue.AlleFarbtabellen.Length - 1) As Color
            For I = 0 To C.Length - 1
                C(I) = Hauptmenue.AlleFarbtabellen(I)
            Next
            DDMS(3) = New ObjektDropDownMenue(170, Position.Y, C, New PointF, Netzzugriff, Handler)
            If Spieler >= Menue.Farbtabellen.Length Then
                Dim I As Integer = Spieler
                While I >= Menue.Farbtabellen.Length
                    I -= Menue.Farbtabellen.Length
                End While
                DDMS(3).SetItem(Menue.Farbtabellen(I).ToArgb.ToString)
            Else
                DDMS(3).SetItem(Menue.Farbtabellen(Spieler).ToArgb.ToString)
            End If
            'Player Name
            Labels.Add(New ObjektLabel(10, Position.Y, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {GetPlayerName(Spieler)}, New Point, 10, 0, New PointF, Handler))

            'Handler hinzufuegen

            SetNetzzugriff(Menue)
        End Sub
        Public Sub Malen(ByVal M As ObjektKartenauswahlMenue)
            For I = 0 To NUDS.Length - 1
                NUDS(I).Malen()
            Next
            For I = 0 To DDMS.Length - 1
                DDMS(I).Malen()
            Next
            For Each LBL In Labels
                LBL.Malen()
            Next
            Dim R As New Rectangle(110, Position.Y - 2, 48, 12)
            Dim P As Point = Handler.Koordinaten + Handler.InternePosition
            If Not M.KOS(Spieler, 0) Is Nothing Then
                If Not M.KOS(Spieler, 1) Is Nothing Then
                    If Handler.InVisibleArea(R, True) Then
                        M.KOS(Spieler, 0).KOGesichtsausdruckMalen(0, 110 + P.X, Position.Y - 2 + P.Y, 18, 12)
                    End If
                    R.Y += 12
                    If Handler.InVisibleArea(R, True) Then
                        M.KOS(Spieler, 1).KOGesichtsausdruckMalen(0, 110 + P.X, Position.Y - 2 + 12 + P.Y, 18, 12)
                    End If
                Else
                    R.Height = 24
                    If Handler.InVisibleArea(R, True) Then
                        M.KOS(Spieler, 0).KOGesichtsausdruckMalen(0, 110 + P.X, Position.Y - 2 + P.Y, 12, 24)
                    End If
                End If
            End If
        End Sub
        Public Function MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) As Boolean
            'Nur der Host darf hier etwas veraendern
            e = New System.Windows.Forms.MouseEventArgs(e.Button, e.Clicks, e.X, e.Y, e.Delta)
            For I = 0 To DDMS.Length - 1
                If Objekt2D.HasFocus Then
                    If DDMS(I).Focused Then
                        DDMS(I).MouseDown(sender, e)
                        Update()
                        Return True
                    End If
                Else
                    DDMS(I).MouseDown(sender, e)
                    If DDMS(I).Focused Then
                        Update()
                        Return True
                    End If
                End If
            Next
            If Netzzugriff Then
                For I = 0 To NUDS.Length - 1
                    NUDS(I).MouseDown(e.X, e.Y)
                Next
            End If
            Update()
            Return False
        End Function
        Public Function MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) As Boolean
            'Nur der Host darf hier etwas veraendern
            e = New System.Windows.Forms.MouseEventArgs(e.Button, e.Clicks, e.X, e.Y, e.Delta)
            For I = 0 To DDMS.Length - 1
                If Objekt2D.HasFocus Then
                    If DDMS(I).Focused Then
                        DDMS(I).MouseUp(sender, e)
                        Update()
                        Return True
                    End If
                Else
                    DDMS(I).MouseUp(sender, e)
                    If DDMS(I).Focused Then
                        Update()
                        Return True
                    End If
                End If
            Next
            If Netzzugriff Then
                For I = 0 To NUDS.Length - 1
                    NUDS(I).MouseUp(e.X, e.Y)
                Next
            End If
            Update()
            Return False
        End Function
        Public Sub MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
            For I = 0 To DDMS.Length - 1
                DDMS(I).MouseEnter(sender, e)
            Next
        End Sub
        Public Sub Update()
            If Not Objektverwalter.Menue Is Nothing Then
                If TypeOf Objektverwalter.Menue Is ObjektKartenauswahlMenue Then
                    Dim M As ObjektKartenauswahlMenue = Objektverwalter.Menue
                    For I = 0 To M.Spielerdaten.Length - 1
                        M.Spielerdaten(I).Update(M)
                    Next
                End If
            End If

        End Sub
        Public Sub Update(ByVal M As ObjektKartenauswahlMenue)
            Dim KIStufe As ObjektSpieler.KIStufen = [Enum].Parse(ObjektSpieler.KIStufen.Einfach.GetType, DDMS(1).GetItem)
            M.KIStufen(Spieler) = KIStufe
            M.Startfonds(Spieler) = NUDS(0).GetValue
            M.FondsproStadt(Spieler) = NUDS(1).GetValue
            M.FondsproFabrik(Spieler) = NUDS(2).GetValue
            Dim I As Objektverwalter.ABC = [Enum].Parse(Objektverwalter.ABC.A.GetType, DDMS(0).GetItem)
            M.Teams(Spieler) = I.ToString
            Dim Item As String = DDMS(2).GetItem
            If Item <> "Ind." Then
                If Item = Commander_Wars.Baulisten.Ind_1.ToString Or Item = Commander_Wars.Baulisten.Ind_2.ToString Or Item = Commander_Wars.Baulisten.Ind_3.ToString Then
                    If Not Hauptmenue.Connection.Connected Then
                        Select Case Item.ToUpper
                            Case Commander_Wars.Baulisten.Ind_1.ToString.ToUpper
                                M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.Ind_1))
                            Case Commander_Wars.Baulisten.Ind_2.ToString.ToUpper
                                M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.Ind_2))
                            Case Commander_Wars.Baulisten.Ind_3.ToString.ToUpper
                                M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.Ind_3))
                        End Select
                        EinheitenCheckboxen.UpdateBauliste()
                    End If
                Else
                    Select Case Item
                        Case Commander_Wars.Baulisten.AW.ToString
                            M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.AW))
                        Case Commander_Wars.Baulisten.AW_2.ToString
                            M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.AW_2))
                        Case Commander_Wars.Baulisten.AW_DS.ToString
                            M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.AW_DS))
                        Case Commander_Wars.Baulisten.AW_DC.ToString
                            M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.AW_DC))
                        Case Commander_Wars.Baulisten.CoW.ToString
                            M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.CoW))
                        Case Commander_Wars.Baulisten.CoW_2.ToString
                            M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.CoW_2))
                        Case Else
                            M.Baulisten(Spieler) = Nothing
                    End Select
                    EinheitenCheckboxen.UpdateBauliste()
                End If
            End If
            Dim AlteTabelle As Color = M.Farbtabellen(Spieler)
            'Wir pruefen das mit der Spielerfarbe
            Dim Farbtabelle As Integer = DDMS(3).IsItemOutOfList
            If Farbtabelle < 0 Then
                M.Farbtabellen(Spieler) = DDMS(3).GetItem
            Else
                M.Farbtabellen(Spieler) = Hauptmenue.AlleFarbtabellen(Farbtabelle)
            End If
            If Spieler = ObjektKartenauswahlMenue.MomentanerSpieler Then
                If M.Farbtabellen(Spieler) <> AlteTabelle Then
                    M.Farbeaendern(M.Farbtabellen(Spieler))
                End If
            End If
            SetPlayerName(Spieler, GetPlayerName(Spieler))
            SetNetzzugriff(M)
            'Duerfte das Netz zwar in Anspruch nehmen mal sehen wie gut das klappt
        End Sub
        ''' <summary>
        ''' Entfernt die Handles dieses Objekts
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub RealeseHandles()
            For I = 0 To DDMS.Length - 1
                DDMS(I).RemoveHandles()
            Next
        End Sub
        Public Sub SetDaten(ByVal StartFonds As Integer, ByVal FondsproStadt As Integer, ByVal Fabrikfonds As Integer, ByVal Team As Char, ByVal Bauliste As String)
            NUDS(0).SetValue(StartFonds)
            NUDS(1).SetValue(FondsproStadt)
            NUDS(2).SetValue(Fabrikfonds)
            DDMS(0).SetItem(Team)
            If Bauliste <> "KeineAenderung" Then
                If Bauliste <> "-1" Then
                    DDMS(2).SetItem(Bauliste)
                End If
            End If
        End Sub
        Public Sub SetStartFonds(ByVal StartFonds As Integer)
            NUDS(0).SetValue(StartFonds)
        End Sub
        Public Sub SetFondsProStadt(ByVal FondsproStadt As Integer)
            NUDS(1).SetValue(FondsproStadt)
        End Sub
        Public Sub SetFabrikfonds(ByVal Fabrikfonds As Integer)
            NUDS(2).SetValue(Fabrikfonds)
        End Sub
        Public Sub SetTeam(ByVal Team As Char)
            DDMS(0).SetItem(Team)
            CType(Objektverwalter.Menue, ObjektKartenauswahlMenue).Teams(Spieler) = Team
        End Sub
        Public Sub SetSpielerFarbe(ByVal Farbe As String)
            DDMS(3).SetItem(Farbe)
        End Sub
        Public Sub SetSpielerFarbe(ByVal Farbe As Integer)
            DDMS(3).SetItem(Farbe)
        End Sub
        ''' <summary>
        ''' Darf nur von Einheitencheckbox aufgerufen werden.
        ''' </summary>
        ''' <param name="Liste"></param>
        ''' <remarks></remarks>
        Public Sub SetBauliste(ByVal Liste As String)
            DDMS(2).SetItem(Liste)
            Dim M As ObjektKartenauswahlMenue = Objektverwalter.Menue
            Dim Werte(ObjektKartenauswahlMenue.EinheitenCheckboxen.Checked.Length - 1) As Integer
            Dim Namen(ObjektKartenauswahlMenue.EinheitenCheckboxen.Checked.Length - 1) As String
            For I = 0 To ObjektKartenauswahlMenue.EinheitenCheckboxen.Checked.Length - 1
                If ObjektKartenauswahlMenue.EinheitenCheckboxen.Checked(I) = True Then
                    Werte(I) = 1
                Else
                    Werte(I) = 0
                End If
                Namen(I) = Objektverwalter.AlleEinheiten(I).EinheitenID
            Next
            M.Baulisten(Spieler) = New Bauliste(Werte, Namen)
        End Sub

        Public Function GetKIStufe() As ObjektSpieler.KIStufen
            Return [Enum].Parse(ObjektSpieler.KIStufen.Mensch.GetType, DDMS(1).GetItem)
        End Function
        ''' <summary>
        ''' Legt fest auf welche Objekte wir Zugriff erhalten.
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub SetNetzzugriff(ByVal Menue As ObjektKartenauswahlMenue)
            DDMS(0).SetNetzmodus(False)
            DDMS(1).SetNetzmodus(False)
            DDMS(2).SetNetzmodus(False)
            DDMS(3).SetNetzmodus(False)
            If Hauptmenue.Connection IsNot Nothing Then
                If Hauptmenue.Connection.Connected Then
                    If Hauptmenue.Connection.Hosten Then
                        Netzzugriff = True
                        If GetKIStufe() <> ObjektSpieler.KIStufen.Passiv Then
                            DDMS(0).SetNetzmodus(True)
                            DDMS(3).SetNetzmodus(True)
                        End If
                        DDMS(1).SetNetzmodus(True)
                        DDMS(2).SetNetzmodus(True)

                    Else
                        If GetKIStufe() = ObjektSpieler.KIStufen.Mensch Or GetKIStufe() = ObjektSpieler.KIStufen.Offen Then
                            Netzzugriff = False
                            'Farben darf man selber festlegen.
                            DDMS(3).SetNetzmodus(True)
                            'Teams auch
                            DDMS(0).SetNetzmodus(True)
                            If ObjektSpieler.KIStufen.Offen = GetKIStufe() Then
                                DDMS(1).SetNetzmodus(True)
                            End If
                        Else
                            Netzzugriff = False
                        End If
                    End If
                Else
                    Netzzugriff = True
                    DDMS(0).SetNetzmodus(True)
                    DDMS(1).SetNetzmodus(True)
                    DDMS(2).SetNetzmodus(True)
                    DDMS(3).SetNetzmodus(True)
                End If
            Else
                Netzzugriff = True
                DDMS(0).SetNetzmodus(True)
                DDMS(1).SetNetzmodus(True)
                DDMS(2).SetNetzmodus(True)
                DDMS(3).SetNetzmodus(True)
            End If
        End Sub
        Public Sub SetKIstufe(ByVal Stufe As String)
            DDMS(1).SetItem(Stufe)
        End Sub
        Public Sub ChangeBauliste(ByVal Bauliste As Commander_Wars.Baulisten, ByVal M As ObjektKartenauswahlMenue)
            Select Case Bauliste
                Case Commander_Wars.Baulisten.AW
                    M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.AW))
                Case Commander_Wars.Baulisten.AW_2
                    M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.AW_2))
                Case Commander_Wars.Baulisten.AW_DS
                    M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.AW_DS))
                Case Commander_Wars.Baulisten.AW_DC
                    M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.AW_DC))
                Case Commander_Wars.Baulisten.CoW
                    M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.CoW))
                Case Commander_Wars.Baulisten.CoW_2
                    M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.CoW_2))
                Case Commander_Wars.Baulisten.Ind_1
                    If Not Hauptmenue.Connection.Connected Then M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.Ind_1))
                Case Commander_Wars.Baulisten.Ind_2
                    If Not Hauptmenue.Connection.Connected Then M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.Ind_2))
                Case Commander_Wars.Baulisten.Ind_3
                    If Not Hauptmenue.Connection.Connected Then M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.Ind_3))
                    'Wir machen nichts!
                Case "-1"
                    'Wir machen nichts!
                Case Else
                    M.Baulisten(Spieler) = Nothing
            End Select
            If Bauliste.ToString.ToUpper = "-1" Then
                DDMS(2).SetItem(Sprachconverter.Translate("Ind."))
            Else
                DDMS(2).SetItem(Bauliste.ToString.ToUpper)
            End If

            EinheitenCheckboxen.UpdateBauliste()
        End Sub
        Public Function GetBauliste() As String
            Return DDMS(2).GetItem
        End Function
        Public Function GetStartfonds() As Integer
            Return NUDS(0).GetValue
        End Function
        Public Function GetFondsproStadt() As Integer
            Return NUDS(1).GetValue
        End Function
        Public Function GetFabrikfonds() As Integer
            Return NUDS(2).GetValue
        End Function
        Public Sub ChangeWindowSize(ByVal PosChange As Point)
            For Each DDM In DDMS
                DDM.ChangeWindowSize(PosChange)
            Next
            For Each NUD In NUDS
                NUD.ChangeWindowSize(PosChange)
            Next
        End Sub

    End Class
    Private Class AlleSpieler
        Dim NUDS() As ObjektNumericUpDown = {}
        Dim DDMS() As ObjektDropDownMenue = {}
        Dim Labels() As ObjektLabel = {}
        Dim Spieler As Integer
        Dim LetzteListe As Commander_Wars.Baulisten = Commander_Wars.Baulisten.CoW
        Dim Fonds As Integer = 1000
        Dim Startfonds As Integer = 0
        Dim Fabrikfonds As Integer = 30000
        Dim Handler As ObjektPanel2D
        Public Sub New(ByVal Spieler As Integer, ByVal Menue As ObjektKartenauswahlMenue, ByVal YPos As Integer, ByVal Handler As ObjektPanel2D)
            'Das hier darf nur der Host
            Dim Befehlszugriff As Boolean = True
            If Hauptmenue.Connection IsNot Nothing Then
                If Hauptmenue.Connection.Connected Then
                    If Hauptmenue.Connection.Hosten Then
                        Befehlszugriff = True
                    Else
                        Befehlszugriff = False
                    End If
                Else
                    Befehlszugriff = True
                End If
            Else
                Befehlszugriff = True
            End If
            Me.Handler = Handler
            Me.Spieler = Spieler
            ReDim NUDS(2)
            ReDim DDMS(0)
            ReDim Labels(9)
            Dim Werte() As String = [Enum].GetNames(ObjektSpieler.KIStufen.Mensch.GetType)
            Array.Resize(Werte, Werte.Length - 1)
            '  SUDS(1) = New ObjektStringUpDown(Menue.KIStufen(Spieler), Werte, DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(DataSettings.BildschirmBreite - 450, YPos))
            NUDS(0) = New ObjektNumericUpDown(Menue.Startfonds(Spieler), 0, 99500, DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(320, YPos), 500, New PointF, , Handler)
            Startfonds = Menue.Startfonds(Spieler)
            NUDS(1) = New ObjektNumericUpDown(Menue.FondsproStadt(Spieler), 500, 99500, DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(395, YPos), 500, New PointF, , Handler)
            Fonds = Menue.FondsproStadt(Spieler)
            NUDS(2) = New ObjektNumericUpDown(Menue.FondsproFabrik(Spieler), 500, 99500, DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(470, YPos), 500, New PointF, , Handler)
            Fabrikfonds = Menue.FondsproFabrik(Spieler)
            '   Dim I As Integer = [Enum].Parse(Objektverwalter.ABC.A.GetType, Menue.Teams(Spieler))
            '   SUDS(0) = New ObjektStringUpDown(I, [Enum].GetNames(Objektverwalter.ABC.A.GetType), DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(DataSettings.BildschirmBreite - 100, YPos))
            Dim Items As String() = New String() {Commander_Wars.Baulisten.AW.ToString, Commander_Wars.Baulisten.AW_2.ToString, Commander_Wars.Baulisten.AW_DS.ToString, Commander_Wars.Baulisten.AW_DC.ToString, Commander_Wars.Baulisten.CoW.ToString, Commander_Wars.Baulisten.CoW_2.ToString, _
                                                Commander_Wars.Baulisten.Ind_1.ToString, Commander_Wars.Baulisten.Ind_2.ToString, Commander_Wars.Baulisten.Ind_3.ToString}
            DDMS(0) = New ObjektDropDownMenue(610, YPos, Items, New PointF, Befehlszugriff, Handler)
            Select Case DataSettings.CommanderWarsGameModus
                Case CommanderWarsGameModi.AdvanceWars
                    DDMS(0).SetItem(Commander_Wars.Baulisten.AW.ToString)
                Case CommanderWarsGameModi.AdvanceWars2
                    DDMS(0).SetItem(Commander_Wars.Baulisten.AW_2.ToString)
                Case CommanderWarsGameModi.AdvanceWarsDS
                    DDMS(0).SetItem(Commander_Wars.Baulisten.AW_DS.ToString)
                Case CommanderWarsGameModi.AdvanceWarsDC
                    DDMS(0).SetItem(Commander_Wars.Baulisten.AW_DC.ToString)
                Case CommanderWarsGameModi.CommanderWars2
                    DDMS(0).SetItem(Commander_Wars.Baulisten.CoW_2.ToString)
                Case Else
                    DDMS(0).SetItem(Commander_Wars.Baulisten.CoW.ToString)
            End Select

            Labels(9) = New ObjektLabel(10, YPos + 30, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Spielername"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(8) = New ObjektLabel(110, YPos + 30, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"KO's"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(7) = New ObjektLabel(170, YPos + 30, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Farbe"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(0) = New ObjektLabel(210, YPos + 30, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"KI Staerke"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(5) = New ObjektLabel(250, YPos, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Alle"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(1) = New ObjektLabel(320, YPos + 30, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Fonds"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(2) = New ObjektLabel(395, YPos + 30, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Einkommen"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(3) = New ObjektLabel(470, YPos + 30, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Fabrik"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(4) = New ObjektLabel(550, YPos + 30, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Team"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(6) = New ObjektLabel(610, YPos + 30, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Liste"}, New Point(0, 0), 10, 0, New PointF, Handler)


            'Labels(8) = New ObjektLabel(510, YPos + 30, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Armee"}, New Point(0, 0), 10, 0, New PointF, Handler)

            'Handler hinzufuegen
        End Sub
        Public Sub Malen()
            For I = 0 To NUDS.Length - 1
                NUDS(I).Malen()
            Next
            For I = 0 To Labels.Length - 1
                Labels(I).Malen()
            Next

        End Sub
        Public Function MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) As Boolean
            'Nur der Host darf hier etwas veraendern
            If Hauptmenue.Connection IsNot Nothing Then
                If Hauptmenue.Connection.Connected Then
                    If Hauptmenue.Connection.Hosten = False Then
                        Return False
                    End If
                End If
            End If
            e = New System.Windows.Forms.MouseEventArgs(e.Button, e.Clicks, e.X, e.Y, e.Delta)
            For I = 0 To DDMS.Length - 1
                If Objekt2D.HasFocus Then
                    If DDMS(I).Focused Then
                        DDMS(I).MouseDown(sender, e)
                        Update()
                        Return True
                    End If
                Else
                    DDMS(I).MouseDown(sender, e)
                    If DDMS(I).Focused Then
                        Update()
                        Return True
                    End If
                End If
            Next
            For I = 0 To NUDS.Length - 1
                NUDS(I).MouseDown(e.X, e.Y)
            Next

            Update()
            Return False
        End Function
        Public Function MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) As Boolean
            'Nur der Host darf hier etwas veraendern
            If Hauptmenue.Connection IsNot Nothing Then
                If Hauptmenue.Connection.Connected Then
                    If Hauptmenue.Connection.Hosten = False Then
                        Return False
                    End If
                End If
            End If
            e = New System.Windows.Forms.MouseEventArgs(e.Button, e.Clicks, e.X, e.Y, e.Delta)
            For I = 0 To DDMS.Length - 1
                If Objekt2D.HasFocus Then
                    If DDMS(I).Focused Then
                        DDMS(I).MouseUp(sender, e)
                        Update()
                        Return True
                    End If
                Else
                    DDMS(I).MouseUp(sender, e)
                    If DDMS(I).Focused Then
                        Update()
                        Return True
                    End If
                End If
            Next
            For I = 0 To NUDS.Length - 1
                NUDS(I).MouseUp(e.X, e.Y)
            Next

            Update()
            Return False
        End Function
        Public Sub MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
            For I = 0 To DDMS.Length - 1
                DDMS(I).MouseEnter(sender, e)
            Next
        End Sub
        Private Sub Update()
            If Not Objektverwalter.Menue Is Nothing Then
                If TypeOf Objektverwalter.Menue Is ObjektKartenauswahlMenue Then
                    Dim M As ObjektKartenauswahlMenue = Objektverwalter.Menue
                    Dim Liste As String = "KeineAenderung"
                    Dim AlteListe As String = LetzteListe.ToString

                    If AlteListe.ToUpper = DDMS(0).GetItem.ToString.ToUpper Then
                        Liste = "KeineAenderung"
                    Else
                        Liste = DDMS(0).GetItem
                        Select Case Liste
                            Case Commander_Wars.Baulisten.AW.ToString
                                LetzteListe = Commander_Wars.Baulisten.AW
                            Case Commander_Wars.Baulisten.AW_2.ToString
                                LetzteListe = Commander_Wars.Baulisten.AW_2
                            Case Commander_Wars.Baulisten.AW_DS.ToString
                                LetzteListe = Commander_Wars.Baulisten.AW_DS
                            Case Commander_Wars.Baulisten.CoW.ToString
                                LetzteListe = Commander_Wars.Baulisten.CoW
                            Case Commander_Wars.Baulisten.CoW_2.ToString
                                LetzteListe = Commander_Wars.Baulisten.CoW_2
                            Case Commander_Wars.Baulisten.AW_DC.ToString
                                LetzteListe = Commander_Wars.Baulisten.AW_DC
                            Case Commander_Wars.Baulisten.Ind_1.ToString
                                LetzteListe = Commander_Wars.Baulisten.Ind_1
                            Case Commander_Wars.Baulisten.Ind_2.ToString
                                LetzteListe = Commander_Wars.Baulisten.Ind_2
                            Case Commander_Wars.Baulisten.Ind_3.ToString
                                LetzteListe = Commander_Wars.Baulisten.Ind_3
                        End Select
                    End If
                    Dim UpdateStartfonds As Boolean = False
                    Dim UpdateFonds As Boolean = False
                    Dim UpdateFabrikfonds As Boolean = False
                    If Startfonds <> NUDS(0).GetValue Then
                        UpdateStartfonds = True
                    End If
                    If NUDS(1).GetValue <> Fonds Then
                        UpdateFonds = True
                    End If
                    If NUDS(2).GetValue <> Fabrikfonds Then
                        UpdateFabrikfonds = True
                    End If
                    For I = 0 To M.Spielerdaten.Length - 1
                        Dim NeuStartFonds As Integer = M.Spielerdaten(I).GetStartfonds
                        Dim NeuFondsproStadt As Integer = M.Spielerdaten(I).GetFondsproStadt
                        Dim NeuFabrikfonds As Integer = M.Spielerdaten(I).GetFabrikfonds
                        If UpdateStartfonds Then
                            NeuStartFonds = NUDS(0).GetValue
                            Startfonds = NUDS(0).GetValue
                        End If
                        If UpdateFonds Then
                            NeuFondsproStadt = NUDS(1).GetValue
                            Fonds = NUDS(1).GetValue
                        End If
                        If UpdateFabrikfonds Then
                            NeuFabrikfonds = NUDS(2).GetValue
                            Fabrikfonds = NUDS(2).GetValue
                        End If
                        M.Spielerdaten(I).SetDaten(NeuStartFonds, NeuFondsproStadt, NeuFabrikfonds, M.Teams(I + 1), Liste)
                    Next



                    For I = 0 To M.Spielerdaten.Length - 1
                        M.Spielerdaten(I).Update(M)
                    Next
                End If
            End If
        End Sub
        ''' <summary>
        ''' Entfernt die Handles dieses Objekts
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub RealeseHandles()
            For I = 0 To DDMS.Length - 1
                DDMS(I).RemoveHandles()
            Next
        End Sub
        Public Sub ChangeWindowSize(ByVal PosChange As Point)
            For Each DDM In DDMS
                DDM.ChangeWindowSize(PosChange)
            Next
            For Each NUD In NUDS
                NUD.ChangeWindowSize(PosChange)
            Next
            For Each Label In Labels
                Label.ChangeWindowSize(PosChange)
            Next
        End Sub
    End Class
    ''' <summary>
    ''' Gets the Name of this Player
    ''' </summary>
    ''' <param name="Player">1=First Player</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function GetPlayerName(ByVal Player As Integer) As String
        If TypeOf Objektverwalter.Menue Is ObjektKartenauswahlMenue Then
            Dim M As ObjektKartenauswahlMenue = Objektverwalter.Menue
            If M.KIStufen(Player) = ObjektSpieler.KIStufen.Mensch Then
                Return DataSettings.Autor
            ElseIf M.KIStufen(Player) = ObjektSpieler.KIStufen.Passiv Then
                If M.Spielerdaten.Length <= Player - 1 Then
                    If M.Spielernamen.Length > Player - 1 Then
                        Return M.Spielernamen(Player - 1)
                    Else
                        Return "Anonym"
                    End If
                Else
                    If M.Spielerdaten(Player - 1) IsNot Nothing Then
                        Return M.Spielerdaten(Player - 1).Labels(0).Text.Text(0)
                    Else
                        If M.Spielernamen.Length > Player - 1 Then
                            Return M.Spielernamen(Player - 1)
                        Else
                            Return "Anonym"
                        End If
                    End If
                End If
            ElseIf M.KIStufen(Player) <> ObjektSpieler.KIStufen.Geschlossen And M.KIStufen(Player) <> ObjektSpieler.KIStufen.Offen Then
                Dim AI As Integer = 1
                For i = 1 To Player - 1
                    If M.KIStufen(i) <> ObjektSpieler.KIStufen.Mensch And M.KIStufen(i) <> ObjektSpieler.KIStufen.Geschlossen And M.KIStufen(i) <> ObjektSpieler.KIStufen.Offen And M.KIStufen(i) <> ObjektSpieler.KIStufen.Passiv Then
                        AI += 1
                    End If
                Next
                Return Sprachconverter.Translate("Computer") + " " + AI.ToString
            Else
                Select Case M.KIStufen(Player)
                    Case ObjektSpieler.KIStufen.Offen, ObjektSpieler.KIStufen.Geschlossen
                        Return "Anonym"
                    Case Else
                        If M.Spielerdaten(Player - 1) IsNot Nothing Then
                            Return M.Spielerdaten(Player - 1).Labels(0).Text.Text(0)
                        Else
                            Return "Anonym"
                        End If
                End Select
            End If
        Else
            If Objektverwalter.Spielfeld IsNot Nothing Then
                If Objektverwalter.Spielfeld.Spieler(Player).KIStufe = ObjektSpieler.KIStufen.Mensch Then
                    Return DataSettings.Autor
                ElseIf Objektverwalter.Spielfeld.Spieler(Player).KIStufe = ObjektSpieler.KIStufen.Passiv Then
                    Return "Anonym"
                ElseIf Objektverwalter.Spielfeld.Spieler(Player).KIStufe <> ObjektSpieler.KIStufen.Geschlossen And Objektverwalter.Spielfeld.Spieler(Player).KIStufe <> ObjektSpieler.KIStufen.Offen Then
                    Dim AI As Integer = 1
                    For i = 1 To Player - 1
                        If Objektverwalter.Spielfeld.Spieler(i).KIStufe <> ObjektSpieler.KIStufen.Mensch And Objektverwalter.Spielfeld.Spieler(i).KIStufe <> ObjektSpieler.KIStufen.Geschlossen And Objektverwalter.Spielfeld.Spieler(i).KIStufe <> ObjektSpieler.KIStufen.Offen And Objektverwalter.Spielfeld.Spieler(i).KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                            AI += 1
                        End If
                    Next
                    Return Sprachconverter.Translate("Computer") + " " + AI.ToString
                Else
                    Return "Anonym"
                End If
            Else
                Return "Anonym"
            End If
        End If
    End Function
    Public Shared Sub SetPlayerName(ByVal Player As Integer, ByVal Name As String)
        Dim M As ObjektKartenauswahlMenue = Objektverwalter.Menue
        If M.Spielerdaten.Length > Player - 1 Then
            M.Spielerdaten(Player - 1).Labels(0).Text.Text(0) = Name
        End If
        If M.Spielernamen.Length > Player - 1 Then
            M.Spielernamen(Player - 1) = Name
        End If
    End Sub
#End Region
    ''' <summary>
    ''' Veraendert die Anzeige Farben und so bei der Spielerauswahl
    ''' </summary>
    ''' <param name="Spieler"></param>
    ''' <remarks></remarks>
    Private Sub ChangePlayer(ByVal Spieler As Integer)
        bStartbereitShowButtons = False
        MomentanerSpieler = Spieler
        If EinheitenCheckboxen Is Nothing Then
            EinheitenCheckboxen.NeueFarbtabelle(New ObjektSpieler(MomentanerSpieler, Farbtabellen(MomentanerSpieler), 0, Nothing, 0, "", "", Nothing, ObjektSpieler.KIStufen.Mensch, 0), Farbtabellen(MomentanerSpieler))
        End If
        KOAnzeigeTexturenKaden(Farbtabellen(MomentanerSpieler))
    End Sub
    ''' <summary>
    ''' Wir veraendern ein paar Daten.;)
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub UpdateSpielerAuswahl()
        If Not DropDownMenues(0) Is Nothing Then
            If DropDownMenues(0).GetItem <> MomentanerSpieler Then
                ChangePlayer(DropDownMenues(0).GetItem)
            End If
        End If
        Updateframe += 1
        If Updateframe Mod UPDATERATE / 5 = 0 Then
            If Hauptmenue.Lobby IsNot Nothing Then
                If Hauptmenue.Connection.Hosten Then
                    ClientDataMutex.Lock()
                    For i = 0 To ClientDatas.Count - 1
                        'Client User Pakete durchgehen und aufnehmen
                        If KIStufen(ClientDatas(i).Player) = ObjektSpieler.KIStufen.Offen Or KIStufen(ClientDatas(i).Player) = ObjektSpieler.KIStufen.Passiv Then
                            '  KIStufen(ClientDatas(i).Player)=
                            If ClientDatas(i).KO1 = "NOTHING" Then
                                KOS(ClientDatas(i).Player, 0) = Nothing
                            Else
                                KOS(ClientDatas(i).Player, 0) = ObjektLadeklasse.NewKO(ClientDatas(i).KO1, ClientDatas(i).Player)
                            End If
                            If ClientDatas(i).KO2 = "NOTHING" Then
                                KOS(ClientDatas(i).Player, 1) = Nothing
                            Else
                                KOS(ClientDatas(i).Player, 1) = ObjektLadeklasse.NewKO(ClientDatas(i).KO2, ClientDatas(i).Player)
                            End If
                            SetPlayerName(ClientDatas(i).Player, ClientDatas(i).Autor)
                            Teams(ClientDatas(i).Player) = ClientDatas(i).Team
                            If Spielerdaten.Length >= ClientDatas(i).Player Then
                                Spielerdaten(ClientDatas(i).Player - 1).SetTeam(Teams(ClientDatas(i).Player))
                            End If
                            Farbtabellen(ClientDatas(i).Player) = ClientDatas(i).farbe
                            Spielerdaten(ClientDatas(i).Player - 1).SetSpielerFarbe(ClientDatas(i).farbe.ToArgb.ToString)
                            Spielerdaten(ClientDatas(i).Player - 1).PlayerID = ClientDatas(i).PlayerID
                            Spielerdaten(ClientDatas(i).Player - 1).ClientPlayer = True
                            Spielerdaten(ClientDatas(i).Player - 1).Updated = True
                            CType(Me, ObjektNetzwerkMenue).SetKIStufe(ClientDatas(i).Player, ObjektSpieler.KIStufen.Passiv)
                        End If
                    Next

                    ClientDatas.Clear()
                    ClientDataMutex.Unlock()
                    'Setup Lobby Info
                    If Hauptmenue.Lobby.Connection.Hosten Then
                        Dim Players As Integer = 0
                        Dim HostFound As Boolean = False
                        For i = 1 To KIStufen.Length - 1
                            Select Case KIStufen(i)
                                Case ObjektSpieler.KIStufen.Mensch
                                    If HostFound Then
                                        Players += 1
                                    Else
                                        HostFound = True
                                    End If
                                Case ObjektSpieler.KIStufen.Passiv
                                    Players += 1
                                Case ObjektSpieler.KIStufen.Offen
                                Case Else
                                    Players += 1
                            End Select
                        Next
                        For i = 0 To Hauptmenue.Lobby.Games.Count - 1
                            If Hauptmenue.Lobby.Games(i).GameID = Hauptmenue.Lobby.CurrentGame.GameID Then
                                Hauptmenue.Lobby.Games(i).CurrentPlayers = Players
                                Exit For
                            End If
                        Next
                    Else
                        Dim Players As Integer = 0
                        Dim HostFound As Boolean = False
                        For i = 1 To KIStufen.Length - 1
                            Select Case KIStufen(i)
                                Case ObjektSpieler.KIStufen.Mensch
                                    If HostFound Then
                                        Players += 1
                                    Else
                                        HostFound = True
                                    End If
                                Case ObjektSpieler.KIStufen.Passiv
                                    Players += 1
                                Case ObjektSpieler.KIStufen.Offen
                                Case Else
                                    Players += 1
                            End Select
                        Next
                        Hauptmenue.Lobby.Connection.SendData("KIPlayers:" + Hauptmenue.Lobby.CurrentGame.GameID.ToString + ":" + Players.ToString)
                    End If
                End If
            End If

            For I = 0 To Spielerdaten.Length - 1
                Spielerdaten(I).Update(Me)
            Next
            If Updateframe > UPDATERATE And Hauptmenue.Connection.Hosten Then
                Dim Send As Boolean = True
                For i = 0 To Spielerdaten.Length - 1
                    If Spielerdaten(i).GetKIStufe = ObjektSpieler.KIStufen.Passiv Then
                        If Not Spielerdaten(i).Updated Then Send = False
                    End If
                Next
                If Send Then
                    SendPlayerInformation()
                    For i = 0 To Spielerdaten.Length - 1
                        Spielerdaten(i).Updated = False
                    Next
                End If
                If Hauptmenue.Connection IsNot Nothing Then
                    If Hauptmenue.Connection.Connected And Hauptmenue.Connection.Hosten Then
                        Hauptmenue.NetzBefehlKartenauswahlSendenRegeln(Regeln) 'Host please give us the Rules.
                    End If
                End If
                Updateframe = 0
                'Clients have a kind a higher send frequenz
            ElseIf Updateframe >= UPDATERATE / 3 And Not Hauptmenue.Connection.Hosten Then
                SendPlayerInformation()
                Updateframe = 0
            End If
        End If
    End Sub
    Protected Function SpielBereit() As Boolean
        If Hauptmenue.Connection IsNot Nothing Then
            If Hauptmenue.Connection.Connected And Hauptmenue.Connection.Hosten = False And RuleRecieved = False Then
                Return False
            Else
                Dim Spieler As Integer = KIStufen.Length - 1
                For I = 0 To KIStufen.Length - 1
                    If KIStufen(I) <> ObjektSpieler.KIStufen.Geschlossen Then
                        If KOS(I, 0) Is Nothing Then
                            Return False
                        ElseIf KIStufen(I) = ObjektSpieler.KIStufen.Offen Then
                            Return False
                        End If
                    Else
                        Spieler -= 1
                    End If
                Next
                If Spieler >= 2 Then
                    Return True
                Else
                    Return False
                End If
            End If
        Else
            Dim Spieler As Integer = KIStufen.Length - 1
            For I = 0 To KIStufen.Length - 1
                If KIStufen(I) <> ObjektSpieler.KIStufen.Geschlossen Then
                    If KOS(I, 0) Is Nothing Then
                        Return False
                    ElseIf KIStufen(I) = ObjektSpieler.KIStufen.Offen Then
                        Return False
                    End If
                Else
                    Spieler -= 1
                End If
            Next
            If Spieler >= 2 Then
                Return True
            Else
                Return False
            End If
        End If
    End Function
    ''' <summary>
    ''' Waehlt die Spieler durch.
    ''' </summary>
    ''' <param name="Richtung"></param>
    ''' <remarks></remarks>
    Protected Sub NextPlayer(ByVal Richtung As Integer)
        LoeschenButton("Zurueck")
        NeuButton(30, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Zurueck", New PointF(0, 1))
        Dim MomItem As Integer = DropDownMenues(0).GetItemNumber
        If MomItem >= 0 Then
            If MomItem + Richtung < DropDownMenues(0).GetItemZahl And MomItem + Richtung >= 0 Then
                DropDownMenues(0).SetItem(MomItem + Richtung)
            Else
                DropDownMenues(0).SetItem(MomItem)
            End If
        Else
            DropDownMenues(0).SetItem(0)
        End If
        If MomItem + Richtung >= DropDownMenues(0).GetItemZahl - 1 Then
            LoeschenButton("Weiter")
            bStartbereitShowButtons = False
            CheckButtonStarten()
        ElseIf MomItem = DropDownMenues(0).GetItemZahl - 1 And Richtung < 0 Then
            LoeschenButton("Bereit")
            LoeschenButton("Starten")
            bStartbereitShowButtons = False
            NeuButton(DataSettings.BildschirmBreite - 138, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Weiter", New PointF(1, 1))
        End If

    End Sub
    Protected Sub CheckButtonStarten()
        If KAModus = KAModi.SpielerAuswahl Then
            If bStartbereitShowButtons Then  'Wenn die Buttons schon angezeigt werden, muessen wir sie nicht nochmal anzeigen :)
                If Not SpielBereit() Then
                    If Hauptmenue.Connection.Connected Then
                        LoeschenButton("Bereit")
                    Else
                        LoeschenButton("Starten")
                    End If
                    bStartbereitShowButtons = False
                End If
            Else
                If SpielBereit() Then
                    If DropDownMenues.Length > 0 Then
                        If Not DropDownMenues(0) Is Nothing Then
                            If Hauptmenue.Connection IsNot Nothing Then
                                If Hauptmenue.Connection.Connected Then
                                    LoeschenButton("Bereit")
                                Else
                                    LoeschenButton("Starten")
                                End If
                            Else
                                LoeschenButton("Starten")
                            End If
                            If DropDownMenues(0).GetItemNumber >= DropDownMenues(0).GetItemZahl - 1 Then 'OK, wir haben den letzten Spieler ausgewaehlt.
                                LoeschenButton("Weiter")
                                If Hauptmenue.Connection IsNot Nothing Then
                                    If Hauptmenue.Connection.Connected Then ' And Not Hauptmenue.Connection.Hosten Then
                                        NeuButton(DataSettings.BildschirmBreite - 138, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Bereit", New PointF(1, 1))
                                    Else
                                        NeuButton(DataSettings.BildschirmBreite - 138, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Starten", New PointF(1, 1))
                                    End If
                                Else
                                    NeuButton(DataSettings.BildschirmBreite - 138, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Starten", New PointF(1, 1))
                                End If
                                bStartbereitShowButtons = True
                            Else
                                LoeschenButton("Weiter")
                                NeuButton(DataSettings.BildschirmBreite - 138, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Weiter", New PointF(1, 1))
                                If Hauptmenue.Connection.Connected Then ' And Not Hauptmenue.Connection.Hosten Then
                                    NeuButton(DataSettings.BildschirmBreite - 138, DataSettings.BildschirmHoehe - 60, DataSettings.Resourcenpfad + "Objects\Button.png", "Bereit", New PointF(1, 1))
                                Else
                                    NeuButton(DataSettings.BildschirmBreite - 138, DataSettings.BildschirmHoehe - 60, DataSettings.Resourcenpfad + "Objects\Button.png", "Starten", New PointF(1, 1))
                                End If
                                bStartbereitShowButtons = True
                            End If
                        End If
                    End If
                End If
            End If
        End If
    End Sub
#End Region
#Region "RegelAuswahl"
    Dim LastGameModus As CommanderWarsGameModi
    ''' <summary>
    ''' Hier wird der Regelauswahl Bildschirm erstellt
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub RegelnFestlegen()
        If Objektverwalter.Minimap IsNot Nothing Then
            Objektverwalter.Minimap.Wirdgemalt = False
        End If
        ResetKartenAuswahl()
        'Die Knoepfe werden auf Weiter und Zurueck reduziert.
        LoeschenButton("Spielerfarbe")
        LoeschenButton("Zufallskarte")

        NeuButton(DataSettings.BildschirmBreite / 2 - 55, DataSettings.BildschirmHoehe - 30, DataSettings.Resourcenpfad + "Objects\Button.png", "Regel Speichern", New PointF(0.5, 1))
        NeuButton(DataSettings.BildschirmBreite / 2 - 55, DataSettings.BildschirmHoehe - 60, DataSettings.Resourcenpfad + "Objects\Button.png", "Regel Laden", New PointF(0.5, 1))

        ReDim Labels(31)
        ReDim NUDS(4)
        ReDim SUDS(0)
        ReDim MultiValues(0)
        ReDim CheckBoxen(11)
        ReDim DropDownMenues(5)
        ReDim TUDS(0)

        Dim P As New ObjektPanel2D(New Rectangle(0, 0, DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe), New PointF(1, 1), 1, False)
        'Wir erschaffen die 4 Label mit den Wetterarten



        'Weather and Effects
        Labels(25) = New ObjektLabel(30, 30, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Umwelt"}, New Point, 16, 0, New PointF(), P)
        'Wetter haeufigkeit
        'Sonne
        Labels(0) = New ObjektLabel(30, 60, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Sonne"}, New Point, 10, 0, New PointF(), P)
        'Regen
        Labels(1) = New ObjektLabel(30, 80, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Regen"}, New Point, 10, 0, New PointF(), P)
        'Schnee
        Labels(2) = New ObjektLabel(30, 100, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Schnee"}, New Point, 10, 0, New PointF(), P)
        'Sandsturm
        Labels(3) = New ObjektLabel(30, 120, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Sandsturm"}, New Point, 10, 0, New PointF(), P)
        'Der Multivalue fuer das Wetter wird erschaffen
        MultiValues(0) = New ObjektMultiValue(0, 100, 4, New Point(160, 60), 100, 20, New PointF, P)
        'Die Values erhalten die Standardwerte der Karte
        For I = 0 To 3
            MultiValues(0).SetValue(I, SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.Wetterwahrscheinlichkeiten(I), False)
        Next
        'Der Kriegsnebel
        Labels(4) = New ObjektLabel(30, 220, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Kriegsnebel"}, New Point, 10, 0, New PointF(), P)
        SUDS(0) = New ObjektStringUpDown(SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.Nebel, [Enum].GetNames(Nebelarten.Aus.GetType), DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(160, 220), New PointF(), P)
        'Standardwetter
        Labels(15) = New ObjektLabel(30, 140, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Standardwetter"}, New Point, 10, 0, New PointF(), P)
        DropDownMenues(1) = New ObjektDropDownMenue(160, 140, [Enum].GetNames(ObjektSpielfeld.Wetterarten.Regen.GetType), New PointF, , P)
        DropDownMenues(1).SetItem(SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.Standardwetter)
        'Zufallswetter?
        Labels(16) = New ObjektLabel(30, 160, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Zufallswetter"}, New Point, 10, 0, New PointF(), P)
        CheckBoxen(5) = New ObjektCheckBox(New Point(160, 160), "CheckBox", New PointF, SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.Zufallswetter, P)
        'Gebaeude Schwachstelle 
        Labels(23) = New ObjektLabel(30, 180, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Gebaeude Schwachstelle"}, New Point, 10, 0, New PointF(), P)
        CheckBoxen(10) = New ObjektCheckBox(New Point(160, 180), "CheckBox", New PointF, Not SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.KeineGebaeudeSchwachstelle, P)
        'Luftschlacht
        Labels(11) = New ObjektLabel(30, 200, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Luftschlacht"}, New Point, 10, 0, New PointF(), P)
        CheckBoxen(3) = New ObjektCheckBox(New Point(160, 200), "CheckBox", New PointF, SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.Luftschlacht, P)
        'Terrain Normalize
        Labels(31) = New ObjektLabel(30, 240, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Terrainmodus"}, New Point, 10, 0, New PointF(), P)
        DropDownMenues(5) = New ObjektDropDownMenue(160, 240, [Enum].GetNames(ObjektRegeln.Normalized_Terrains.Keine.GetType), New PointF, , P)



        'Gamemoderules
        Labels(26) = New ObjektLabel(300, 30, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Spielmodus"}, New Point, 16, 0, New PointF(), P)
        'Spielmodus
        Labels(13) = New ObjektLabel(300, 60, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Spielmodus"}, New Point, 10, 0, New PointF(), P)
        DropDownMenues(0) = New ObjektDropDownMenue(420, 60, New String() {"Advance Wars", "Advance Wars 2", "Advance Wars DS", "Commander Wars", "Advance Wars DC", "Commander Wars 2"}, New PointF, , P)
        DropDownMenues(0).SetItem(DataSettings.CommanderWarsGameModus)
        LastGameModus = DataSettings.CommanderWarsGameModus
        'Rang
        Labels(12) = New ObjektLabel(300, 80, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Rang System"}, New Point, 10, 0, New PointF(), P)
        CheckBoxen(4) = New ObjektCheckBox(New Point(420, 80), "CheckBox", New PointF, SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.LevelModus, P)
        'Startspieler...
        Labels(14) = New ObjektLabel(300, 100, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Startspieler"}, New Point, 10, 0, New PointF(), P)
        NUDS(2) = New ObjektNumericUpDown(1, 1, KIStufen.Length - 1, DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(420, 100), 1, New PointF(), , P)
        'Doppelgabe?
        Labels(19) = New ObjektLabel(300, 120, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Doppelgabe"}, New Point, 10, 0, New PointF(), P)
        CheckBoxen(7) = New ObjektCheckBox(New Point(420, 120), "CheckBox", New PointF, SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.DoppelGabe, P)
        'KO System
        Labels(20) = New ObjektLabel(300, 140, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"KO System"}, New Point, 10, 0, New PointF(), P)
        Dim Items As String() = [Enum].GetNames(KOSysteme.Gabe_Modus.GetType)
        For I = 0 To Items.Length - 1
            Items(I) = Sprachconverter.Translate(Items(I))
        Next
        DropDownMenues(3) = New ObjektDropDownMenue(420, 140, Items, New PointF, , P)
        DropDownMenues(3).SetItem(SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.KOSystem)
        'Gebaeudezerstoerung
        Labels(21) = New ObjektLabel(300, 160, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Gebaeudezerstoerung"}, New Point, 10, 0, New PointF(), P)
        CheckBoxen(8) = New ObjektCheckBox(New Point(420, 160), "CheckBox", New PointF, SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.GebaeudeZerstoerung, P)
        'Glueck
        Labels(22) = New ObjektLabel(300, 180, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Glueck"}, New Point, 10, 0, New PointF(), P)
        CheckBoxen(9) = New ObjektCheckBox(New Point(420, 180), "CheckBox", New PointF, Not SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.NoLuck, P)
        'Baublockade
        Labels(17) = New ObjektLabel(300, 200, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Baublockade"}, New Point, 10, 0, New PointF(), P)
        CheckBoxen(6) = New ObjektCheckBox(New Point(420, 200), "CheckBox", New PointF, SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.BauBlockade, P)
        'Teurungsrate
        Labels(18) = New ObjektLabel(300, 220, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Teuerungsrate"}, New Point, 10, 0, New PointF(), P)
        NUDS(3) = New ObjektNumericUpDown(SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.Teurungsrate, 0, 10000, DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(420, 220), 100, New PointF(), -1, P)
        'Keine Gabe
        Labels(27) = New ObjektLabel(300, 240, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Keine Gaben"}, New Point, 10, 0, New PointF(), P)
        CheckBoxen(11) = New ObjektCheckBox(New Point(420, 240), "CheckBox", New PointF, SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.KeineGaben, P)
        'Unit Count
        Labels(28) = New ObjektLabel(300, 260, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Einheitenlimit"}, New Point, 10, 0, New PointF(), P)
        NUDS(4) = New ObjektNumericUpDown(SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.MaxTroops, 0, 999999, DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(420, 260), 1, New PointF(), 0, P)
        'Rundenzeit
        Labels(29) = New ObjektLabel(300, 285, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Rundenzeit"}, New Point, 10, 0, New PointF(), P)
        TUDS(0) = New ObjektTimeUpDown(0, 0, TimeSpan.TicksPerHour * 999, DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(420, 285), TimeSpan.TicksPerSecond, New PointF(), -1, P)
        'Zeitmodus
        Labels(30) = New ObjektLabel(300, 310, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Zeitmodus"}, New Point, 10, 0, New PointF(), P)
        Items = [Enum].GetNames(Timer.Timemodus.Single_Countdown.GetType)
        Array.Resize(Items, Items.Length - 1)
        For I = 0 To Items.Length - 1
            Items(I) = Sprachconverter.Translate(Items(I))
        Next
        DropDownMenues(4) = New ObjektDropDownMenue(420, 310, Items, New PointF, , P)

        'Winning Conditions
        Labels(5) = New ObjektLabel(570, 30, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Siegbedingungen"}, New Point, 16, 0, New PointF(), P)
        'Keine HQS
        Labels(6) = New ObjektLabel(570, 60, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Keine HQS"}, New Point, 10, 0, New PointF(), P)
        CheckBoxen(0) = New ObjektCheckBox(New Point(690, 60), "CheckBox", New PointF, , P)
        If SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.StandartSiegbedingungen.Contains(ObjektRegeln.Siegbedingungen.KeineHQs) Then CheckBoxen(0).Checked = True Else CheckBoxen(0).Checked = False
        'Keine Einheiten
        Labels(7) = New ObjektLabel(570, 80, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Keine Einheiten"}, New Point, 10, 0, New PointF(), P)
        CheckBoxen(1) = New ObjektCheckBox(New Point(690, 80), "CheckBox", New PointF, , P)
        If SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.StandartSiegbedingungen.Contains(ObjektRegeln.Siegbedingungen.KeineEinheiten) Then CheckBoxen(1).Checked = True Else CheckBoxen(1).Checked = False
        'Keine Besetzungen
        Labels(8) = New ObjektLabel(570, 100, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Keine Besetzungen"}, New Point, 10, 0, New PointF(), P)
        CheckBoxen(2) = New ObjektCheckBox(New Point(690, 100), "CheckBox", New PointF, , P)
        If SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.StandartSiegbedingungen.Contains(ObjektRegeln.Siegbedingungen.KeineBesetzungen) Then CheckBoxen(2).Checked = True Else CheckBoxen(2).Checked = False
        'Zeitlimit
        Labels(9) = New ObjektLabel(570, 120, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Zeit"}, New Point, 10, 0, New PointF())
        NUDS(0) = New ObjektNumericUpDown(0, 0, 9999, DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(690, 120), 1, New PointF(), 0, P)
        If SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.StandartSiegbedingungen.Contains(ObjektRegeln.Siegbedingungen.Zeit) Then
            NUDS(0).SetValue(SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.MaxSpieldauer)
        Else
            NUDS(0).SetValue(-1)
        End If
        'Besetzungen
        Labels(10) = New ObjektLabel(570, 140, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Besetzungen"}, New Point, 10, 0, New PointF(), P)
        Dim Min As Integer = SpielKarten(AngezeigteKarten(MomentaneKarte)).CalculateMinGebaeudeFuerSieg
        NUDS(1) = New ObjektNumericUpDown(Min, Min, 9999, DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(690, 140), 1, New PointF(), Min, P)
        If SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.StandartSiegbedingungen.Contains(ObjektRegeln.Siegbedingungen.Besetzungen) Then
            NUDS(1).SetValue(SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.MaximaleanzahlderBesetzungen)
        Else
            NUDS(1).SetValue(-1)
        End If


        'Preset Regel
        Labels(24) = New ObjektLabel(300, 400, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Standard Regeln"}, New Point, 10, 0, New PointF(), P)
        Dim Item As New List(Of String)
        Item.AddRange(New String() {"Advance Wars", "Advance Wars 2", "Advance Wars DS", "Commander Wars", "Advance Wars DC", "Commander Wars 2", Sprachconverter.Translate("Kartenregeln")})
        For Each Rule In My.Computer.FileSystem.GetFiles(DataSettings.Resourcenpfad + "!Custom\Rules\", FileIO.SearchOption.SearchTopLevelOnly, "*.rgl")
            Item.Add(Rule.Replace(DataSettings.Resourcenpfad + "!Custom\Rules\", "").Replace(".rgl", ""))
        Next
        DropDownMenues(2) = New ObjektDropDownMenue(420, 400, Item.ToArray, New PointF, , P)
        DropDownMenues(2).SetItem(6)
        LastGameModus = 6
    End Sub
    Private Sub CreateRegeln()


        Dim SiegText As String = ""
        Dim TacticsDialog As New List(Of ObjektScript.EreignisDialog)
        If Regeln IsNot Nothing Then
            SiegText = Regeln.Siegbedingung
            TacticsDialog = Regeln.SitutionsSitzung
        End If


        Dim Siegbedingungen As ObjektRegeln.Siegbedingungen() = {}
        If CheckBoxen(0).Checked = True Then
            Array.Resize(Siegbedingungen, Siegbedingungen.Length + 1)
            Siegbedingungen(Siegbedingungen.Length - 1) = ObjektRegeln.Siegbedingungen.KeineHQs
        End If
        If CheckBoxen(1).Checked = True Then
            Array.Resize(Siegbedingungen, Siegbedingungen.Length + 1)
            Siegbedingungen(Siegbedingungen.Length - 1) = ObjektRegeln.Siegbedingungen.KeineEinheiten
        End If
        If CheckBoxen(2).Checked = True Then
            Array.Resize(Siegbedingungen, Siegbedingungen.Length + 1)
            Siegbedingungen(Siegbedingungen.Length - 1) = ObjektRegeln.Siegbedingungen.KeineBesetzungen
        End If
        Dim Nebel As Nebelarten = [Enum].Parse(Nebelarten.Kriegsnebel.GetType, SUDS(0).GetValue)
        Dim W As ObjektSpielfeld.Wetterarten = DropDownMenues(1).GetItemNumber
        Regeln = New ObjektRegeln(Nebel, SpielKarten(AngezeigteKarten(MomentaneKarte)).Spieler.Length - 1, Siegbedingungen, True, New Integer() {MultiValues(0).GetValue(0), MultiValues(0).GetValue(1), MultiValues(0).GetValue(2), MultiValues(0).GetValue(3)}, W, NUDS(0).GetValue, NUDS(1).GetValue, , CheckBoxen(3).Checked)
        Regeln.SitutionsSitzung = TacticsDialog
        Regeln.Siegbedingung = SiegText

        If CheckBoxen(4).Checked Then
            Regeln.LevelModus = True
        Else
            Regeln.LevelModus = False
        End If
        'Wir schauen nach dem Spielmodus
        Dim AlterModus As Integer = DataSettings.CommanderWarsGameModus
        Select Case DropDownMenues(0).GetItem
            Case "Advance Wars"
                DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.AdvanceWars
            Case "Advance Wars 2"
                DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.AdvanceWars2
            Case "Advance Wars DS"
                DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.AdvanceWarsDS
            Case "Commander Wars"
                DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.CommanderWars
            Case "Advance Wars DC"
                DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.AdvanceWarsDC
            Case "Commander Wars 2"
                DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.CommanderWars2
            Case Else
                DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.CommanderWars
        End Select

        'KO System
        Regeln.KOSystem = DropDownMenues(3).GetItemNumber
        If Regeln.KOSystem < KOSysteme.Gabe_Modus Then Regeln.KOSystem = KOSysteme.Gabe_Modus
        Regeln.Startspieler = NUDS(2).GetValue
        'Zufallswetter
        Regeln.Zufallswetter = CheckBoxen(5).Checked
        'Baublockade
        Regeln.BauBlockade = CheckBoxen(6).Checked
        'Teuerungsrate
        Regeln.Teurungsrate = NUDS(3).GetValue
        'Doppelgabe
        Regeln.DoppelGabe = CheckBoxen(7).Checked
        'Koennen Gebaeude Einheiten zerstoeren?
        Regeln.GebaeudeZerstoerung = CheckBoxen(8).Checked
        'Glueck an oder aus.
        Regeln.NoLuck = Not CheckBoxen(9).Checked
        'Gebaeude schwachstellen
        Regeln.KeineGebaeudeSchwachstelle = Not CheckBoxen(10).Checked
        'Keine Gaben
        Regeln.KeineGaben = CheckBoxen(11).Checked
        'Truppenlimit
        Regeln.MaxTroops = NUDS(4).GetValue
        'Rundenzeit
        Regeln.Rundenzeit = TUDS(0).GetValue
        'Zeitmodus
        Regeln.Timermode = DropDownMenues(4).GetItemNumber
        'Terrainmodus
        Regeln.Normalized_Terrain = DropDownMenues(5).GetItemNumber
        If Regeln.Normalized_Terrain <> ObjektRegeln.Normalized_Terrains.Keine Then
            Regeln.Normalized = True
        Else
            Regeln.Normalized = False
        End If
        'Don't know why this Lines are missing in the original Code :( 
        'Facepalm to death
        'though this take some time now. Loading all the CO's takes years. Damn sprites need to find a smoother variant to load sprites. :D
        If DataSettings.CommanderWarsGameModus <> AlterModus Then
            Objektverwalter.LoadNewGameModus(False)
        End If
        DataSettings.MySettingsIniSave()
    End Sub
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="Vorwaerts">wenn false wird die Zufallskarte geloescht</param>
    ''' <remarks></remarks>
    Private Sub ResetRegelAuswahl(ByVal Vorwaerts As Boolean)
        ReDim NUDS(-1)
        ReDim SUDS(-1)
        ReDim Labels(-1)
        ReDim MultiValues(-1)
        ReDim CheckBoxen(-1)
        ReDim TUDS(-1)
        For I = 0 To DropDownMenues.Length - 1
            DropDownMenues(I).RemoveHandles()
        Next
        ReDim DropDownMenues(-1)
        For Each P In Panels
            P.RemoveHandles()
        Next
        ReDim Panels(-1)
        If Vorwaerts = False Then
            'Zufallskarte loeschen.
            Array.Resize(SpielKarten, Kartenname.Length)
        End If
        LoeschenButton("Regel Speichern")
        LoeschenButton("Regel Laden")
    End Sub
    ''' <summary>
    ''' Kleines Update bei Spielmodus wechsel!
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub UpdateRegeln()
        If DropDownMenues(2) IsNot Nothing Then
            If LastGameModus <> DropDownMenues(2).GetItemNumber Then
                LastGameModus = DropDownMenues(2).GetItemNumber
                UpdateRegeln(LastGameModus)
            End If
        End If
    End Sub
    Private Sub UpdateRegeln(ByVal Regel As Integer)
        Select Case Regel
            Case CommanderWarsGameModi.AdvanceWarsDC
                'Baublockade
                CheckBoxen(6).Checked = False
                'Teurungsrate
                NUDS(3).SetValue(0)
                'Rang Modus
                CheckBoxen(4).Checked = True
                'Luftschlacht
                CheckBoxen(3).Checked = False
                'Doppelgabe
                CheckBoxen(7).Checked = False
                'KO System
                DropDownMenues(3).SetItem(KOSysteme.KO_Modus)
                'Gebaeudezerstoerung
                CheckBoxen(8).Checked = False
                'Glueck
                CheckBoxen(9).Checked = True
                'Gebaeude Schwachstelle
                CheckBoxen(10).Checked = True
                'Gaben
                CheckBoxen(11).Checked = False
                'Einheitenlimit
                NUDS(4).SetValue(50)
                'Weather
                'Sun
                MultiValues(0).SetValue(0, 70, False)
                'Rain
                MultiValues(0).SetValue(1, 10, False)
                'Snow
                MultiValues(0).SetValue(2, 10, False)
                'Sanstorm
                MultiValues(0).SetValue(3, 10, False)
                'Gamemode
                DropDownMenues(0).SetItem(Regel)
                'Rundenzeit
                TUDS(0).SetValue(0)
            Case CommanderWarsGameModi.AdvanceWars
                'Baublockade
                CheckBoxen(6).Checked = False
                'Teurungsrate
                NUDS(3).SetValue(0)
                'Rang Modus
                CheckBoxen(4).Checked = False
                'Luftschlacht
                CheckBoxen(3).Checked = False
                'Doppelgabe
                CheckBoxen(7).Checked = False
                'KO System
                DropDownMenues(3).SetItem(KOSysteme.Gabe_Modus)
                'Gebaeudezerstoerung
                CheckBoxen(8).Checked = False
                'Glueck
                CheckBoxen(9).Checked = True
                'Gebaeude Schwachstelle
                CheckBoxen(10).Checked = True
                'Gaben
                CheckBoxen(11).Checked = False
                'Einheitenlimit
                NUDS(4).SetValue(50)
                'Weather
                'Sun
                MultiValues(0).SetValue(0, 80, False)
                'Rain
                MultiValues(0).SetValue(1, 10, False)
                'Snow
                MultiValues(0).SetValue(2, 10, False)
                'Sanstorm
                MultiValues(0).SetValue(3, 0, False)
                'Gamemode
                DropDownMenues(0).SetItem(Regel)
                'Rundenzeit
                TUDS(0).SetValue(0)
            Case CommanderWarsGameModi.AdvanceWars2
                'Baublockade
                CheckBoxen(6).Checked = False
                'Teurungsrate
                NUDS(3).SetValue(0)
                'Rang Modus
                CheckBoxen(4).Checked = False
                'Luftschlacht
                CheckBoxen(3).Checked = False
                'Doppelgabe
                CheckBoxen(7).Checked = False
                'KO System
                DropDownMenues(3).SetItem(KOSysteme.Gabe_Modus)
                'Gebaeudezerstoerung
                CheckBoxen(8).Checked = False
                'Glueck
                CheckBoxen(9).Checked = True
                'Gebaeude Schwachstelle
                CheckBoxen(10).Checked = True
                'Gaben
                CheckBoxen(11).Checked = False
                'Einheitenlimit
                NUDS(4).SetValue(50)
                'Weather
                'Sun
                MultiValues(0).SetValue(0, 80, False)
                'Rain
                MultiValues(0).SetValue(1, 10, False)
                'Snow
                MultiValues(0).SetValue(2, 10, False)
                'Sanstorm
                MultiValues(0).SetValue(3, 0, False)
                'Gamemode
                DropDownMenues(0).SetItem(Regel)
                'Rundenzeit
                TUDS(0).SetValue(0)
            Case CommanderWarsGameModi.AdvanceWarsDS
                'Baublockade
                CheckBoxen(6).Checked = False
                'Teurungsrate
                NUDS(3).SetValue(0)
                'Rang Modus
                CheckBoxen(4).Checked = False
                'Luftschlacht
                CheckBoxen(3).Checked = False
                'Doppelgabe
                CheckBoxen(7).Checked = True
                'KO System
                DropDownMenues(3).SetItem(KOSysteme.Gabe_Modus)
                'Gebaeudezerstoerung
                CheckBoxen(8).Checked = False
                'Glueck
                CheckBoxen(9).Checked = True
                'Gebaeude Schwachstelle
                CheckBoxen(10).Checked = True
                'Gaben
                CheckBoxen(11).Checked = False
                'Einheitenlimit
                NUDS(4).SetValue(50)
                'Weather
                'Sun
                MultiValues(0).SetValue(0, 70, False)
                'Rain
                MultiValues(0).SetValue(1, 10, False)
                'Snow
                MultiValues(0).SetValue(2, 10, False)
                'Sanstorm
                MultiValues(0).SetValue(3, 10, False)
                'Gamemode
                DropDownMenues(0).SetItem(Regel)
                'Rundenzeit
                TUDS(0).SetValue(0)
            Case CommanderWarsGameModi.CommanderWars
                'Baublockade
                CheckBoxen(6).Checked = False
                'Teurungsrate
                NUDS(3).SetValue(0)
                'Rang Modus
                CheckBoxen(4).Checked = True
                'Luftschlacht
                CheckBoxen(3).Checked = True
                'Doppelgabe
                CheckBoxen(7).Checked = True
                'KO System
                DropDownMenues(3).SetItem(KOSysteme.Gabe_Modus)
                'Gebaeudezerstoerung
                CheckBoxen(8).Checked = True
                'Glueck
                CheckBoxen(9).Checked = True
                'Gebaeude Schwachstelle
                CheckBoxen(10).Checked = False
                'Gaben
                CheckBoxen(11).Checked = False
                'Einheitenlimit
                NUDS(4).SetValue(0)
                'Weather
                'Sun
                MultiValues(0).SetValue(0, 70, False)
                'Rain
                MultiValues(0).SetValue(1, 10, False)
                'Snow
                MultiValues(0).SetValue(2, 10, False)
                'Sanstorm
                MultiValues(0).SetValue(3, 10, False)
                'Gamemode
                DropDownMenues(0).SetItem(Regel)
                'Rundenzeit
                TUDS(0).SetValue(0)
            Case CommanderWarsGameModi.CommanderWars2
                'Baublockade
                CheckBoxen(6).Checked = True
                'Teurungsrate
                NUDS(3).SetValue(100)
                'Rang Modus
                CheckBoxen(4).Checked = True
                'Luftschlacht
                CheckBoxen(3).Checked = False
                'Doppelgabe
                CheckBoxen(7).Checked = False
                'KO System
                DropDownMenues(3).SetItem(KOSysteme.CoW_Hybrid)
                'Gebaeudezerstoerung
                CheckBoxen(8).Checked = True
                'Glueck
                CheckBoxen(9).Checked = True
                'Gebaeude Schwachstelle
                CheckBoxen(10).Checked = True
                'Gaben
                CheckBoxen(11).Checked = False
                'Einheitenlimit
                NUDS(4).SetValue(0)
                'Weather
                'Sun
                MultiValues(0).SetValue(0, 70, False)
                'Rain
                MultiValues(0).SetValue(1, 10, False)
                'Snow
                MultiValues(0).SetValue(2, 10, False)
                'Sanstorm
                MultiValues(0).SetValue(3, 10, False)
                'Gamemode
                DropDownMenues(0).SetItem(Regel)
                'Rundenzeit
                TUDS(0).SetValue(0)
            Case Else
                If DropDownMenues(2).GetItemNumber = 6 Then
                    ResetRegelAuswahl(True)
                    RegelnFestlegen()
                Else
                    LoadRule(DataSettings.Resourcenpfad + "!Custom\Rules\" + DropDownMenues(2).GetItem + ".rgl")
                End If
        End Select
    End Sub
    Private Sub WriteRule()
        If MessageBox.ShowOpenSaveDialogue(MessageBox.Modi.SaveDialog, "Regel Speichern", DataSettings.Resourcenpfad + "!Custom\Rules\", New String() {Sprachconverter.Translate("Regel") + " ; *.rgl"}) = MsgBoxResult.Ok Then
            Using StrW As New IO.StreamWriter(MessageBox.CurrentFile, False, Hauptmenue.Codierung)
                StrW.WriteLine("'Custom Game Rule for faster Gamestarts")
                StrW.WriteLine("Weather Chance=" + MultiValues(0).GetValue(0).ToString + "|" + MultiValues(0).GetValue(1).ToString + "|" + MultiValues(0).GetValue(2).ToString + "|" + MultiValues(0).GetValue(3).ToString)
                StrW.WriteLine("Weather=" + DropDownMenues(1).GetItem.ToString)
                StrW.WriteLine("Random Weather=" + CheckBoxen(5).Checked.ToString)
                StrW.WriteLine("Fog=" + SUDS(0).GetValue)
                StrW.WriteLine("No HQs=" + CheckBoxen(0).Checked.ToString)
                StrW.WriteLine("No Units=" + CheckBoxen(1).Checked.ToString)
                StrW.WriteLine("No Properties=" + CheckBoxen(2).Checked.ToString)
                StrW.WriteLine("Air Battle=" + CheckBoxen(3).Checked.ToString)
                StrW.WriteLine("Time=" + NUDS(0).GetValue.ToString)
                StrW.WriteLine("Properties=" + NUDS(1).GetValue.ToString)
                StrW.WriteLine("Rank=" + CheckBoxen(4).Checked.ToString)
                StrW.WriteLine("Gamemode=" + DropDownMenues(0).GetItem.ToString)
                StrW.WriteLine("Startplayer=" + NUDS(2).GetValue.ToString)
                StrW.WriteLine("Building Blockade=" + CheckBoxen(6).Checked.ToString)
                StrW.WriteLine("Fonds Increase=" + NUDS(3).GetValue.ToString)
                StrW.WriteLine("Tagpower=" + CheckBoxen(7).Checked.ToString)
                StrW.WriteLine("Old CO System=" + DropDownMenues(3).GetItemNumber.ToString)
                StrW.WriteLine("Building Destruction=" + CheckBoxen(8).Checked.ToString)
                StrW.WriteLine("Luck=" + CheckBoxen(9).Checked.ToString)
                StrW.WriteLine("Building Weakness=" + CheckBoxen(10).Checked.ToString)
                StrW.WriteLine("No Power=" + CheckBoxen(11).Checked.ToString)
                StrW.WriteLine("Unitlimit=" + NUDS(4).GetValue.ToString)
                StrW.WriteLine("Round Time=" + TUDS(0).GetValue.ToString)
                StrW.WriteLine("Time Mode=" + DropDownMenues(4).GetItemNumber.ToString)
            End Using
        End If
    End Sub
    Private Sub LoadRule()
        If MessageBox.ShowOpenSaveDialogue(MessageBox.Modi.OpenDialog, "Regel Laden", DataSettings.Resourcenpfad + "!Custom\Rules\", New String() {Sprachconverter.Translate("Regel") + " ; *.rgl"}) = MsgBoxResult.Ok Then
            LoadRule(MessageBox.CurrentFile)
        End If
    End Sub
    Private Sub LoadRule(ByVal Rule As String)
        Using StrR As New IO.StreamReader(Rule, Hauptmenue.Codierung)
            While Not StrR.EndOfStream
                Dim LIne As String = StrR.ReadLine
                If LIne.StartsWith("'") Then Continue While
                If LIne.StartsWith("//") Then Continue While
                If LIne.ToLower.StartsWith("weather chance=") Then
                    Dim Values As String() = LIne.Remove(0, LIne.IndexOf("=") + 1).Split("|")
                    MultiValues(0).SetValue(0, Values(0), False)
                    MultiValues(0).SetValue(1, Values(1), False)
                    MultiValues(0).SetValue(2, Values(2), False)
                    MultiValues(0).SetValue(3, Values(3), False)
                    Continue While
                End If
                If LIne.ToLower.StartsWith("weather=") Then
                    DropDownMenues(1).SetItem(LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("random weather=") Then
                    CheckBoxen(5).Checked = (LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("fog=") Then
                    SUDS(0).SetValue(LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("no hqs=") Then
                    CheckBoxen(0).Checked = (LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("no units=") Then
                    CheckBoxen(1).Checked = (LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("no properties=") Then
                    CheckBoxen(2).Checked = (LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("air battle=") Then
                    CheckBoxen(3).Checked = (LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("time=") Then
                    NUDS(0).SetValue(LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("properties=") Then
                    NUDS(1).SetValue(LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("rank=") Then
                    CheckBoxen(4).Checked = (LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("gamemode=") Then
                    DropDownMenues(0).SetItem(LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("startplayer=") Then
                    NUDS(2).SetValue(LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("building blockade=") Then
                    CheckBoxen(6).Checked = (LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("fonds increase=") Then
                    NUDS(3).SetValue(LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("tagpower=") Then
                    CheckBoxen(7).Checked = (LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("old co system=") Then
                    'KO System
                    DropDownMenues(3).SetItem(CInt(LIne.Split("=")(1)))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("building destruction=") Then
                    CheckBoxen(8).Checked = (LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("luck=") Then
                    CheckBoxen(9).Checked = (LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("building weakness=") Then
                    CheckBoxen(10).Checked = (LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("no power=") Then
                    CheckBoxen(11).Checked = (LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("unitlimit=") Then
                    NUDS(4).SetValue(LIne.Remove(0, LIne.IndexOf("=") + 1))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("round time=") Then
                    TUDS(0).SetValue(CLng(LIne.Remove(0, LIne.IndexOf("=") + 1)))
                    Continue While
                End If
                If LIne.ToLower.StartsWith("time mode=") Then
                    DropDownMenues(0).SetItem(CInt(LIne.Remove(0, LIne.IndexOf("=") + 1)))
                    Continue While
                End If
            End While
        End Using
        LastGameModus = DropDownMenues(4).GetItemNumber
    End Sub
#End Region
#Region "Zufallskarte"
    Dim LastVektor As Integer
    Public Sub CreateZufallskartenMenue()
        ResetKartenAuswahl()
        MomentaneKarte = 0
        AngezeigteKarten(0) = 0
        KAModus = KAModi.Zufallskarte
        ReDim Textboxen(0)
        ReDim Labels(10)
        ReDim CheckBoxen(1)
        ReDim NUDS(2)
        ReDim MultiValues(0)

        Dim MainPanel As New ObjektPanel2D(New Rectangle(0, 0, DataSettings.BildschirmBreite, DataSettings.BildschirmHoehe - 200), New PointF(1, 1), 1, False)

        'Zufallsstartzahl
        Labels(0) = New ObjektLabel(10, 50, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Zufallszahl"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        Textboxen(0) = New ObjektTextbox(150, 50, 120, New PointF, MainPanel)

        'Zufallskarte zeigen?
        Labels(1) = New ObjektLabel(10, 75, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Minimap"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        CheckBoxen(0) = New ObjektCheckBox(New Point(150, 75), "CheckBox", New PointF, False, MainPanel)

        'Spieler
        Labels(2) = New ObjektLabel(10, 100, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Spieler"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        NUDS(0) = New ObjektNumericUpDown(2, 2, 100, DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(150, 100), 1, New PointF(), 0, MainPanel)
        'Breite 
        Labels(3) = New ObjektLabel(10, 125, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Breite"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        NUDS(1) = New ObjektNumericUpDown(20, 3, 9999, DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(150, 125), 1, New PointF(), 0, MainPanel)
        'Hoehe
        Labels(4) = New ObjektLabel(10, 150, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Hoehe"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        NUDS(2) = New ObjektNumericUpDown(20, 3, 9999, DataSettings.Resourcenpfad + "Objects\NUD.png", New Point(150, 150), 1, New PointF(), 0, MainPanel)
        'Strasse
        Labels(5) = New ObjektLabel(10, 175, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Strasse"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        CheckBoxen(1) = New ObjektCheckBox(New Point(150, 175), "CheckBox", New PointF, True, MainPanel)


        MultiValues(0) = New ObjektMultiValue(0, 100, 5, New Point(360, 50), 100, 20, New PointF, MainPanel)
        MultiValues(0).SetValue(0, 65, False)
        MultiValues(0).SetValue(1, 12, False)
        MultiValues(0).SetValue(2, 8, False)
        MultiValues(0).SetValue(3, 5, False)
        MultiValues(0).SetValue(4, 10, False)
        Labels(6) = New ObjektLabel(300, 50, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Ebene"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        Labels(7) = New ObjektLabel(300, 70, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Wald"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        Labels(8) = New ObjektLabel(300, 90, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Berg"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        Labels(9) = New ObjektLabel(300, 110, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"See"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        Labels(10) = New ObjektLabel(300, 130, DataSettings.Resourcenpfad + "Objects\Transparent.png", New String() {"Stadt"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        'Generieren Button
        NeuButton(20, 200, DataSettings.Resourcenpfad + "Objects\Button.png", "Naechste Karte", New PointF, , , , MainPanel)
        NeuButton(20, 230, DataSettings.Resourcenpfad + "Objects\Button.png", "Generieren", New PointF, , , , MainPanel)
        'Neue Karte erstellen
        LastVektor = CreateRandomMap(20, 20, 2, True, , MultiValues(0).GetValue(1) / 333, MultiValues(0).GetValue(2) / 333, MultiValues(0).GetValue(3) / 1000, MultiValues(0).GetValue(4) / 100)
        Textboxen(0).SetText(LastVektor)
    End Sub
    ''' <summary>
    ''' Erstellt eine Zufallskarte mit den vorgegebenen Zahlen
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub CreateRandomMap()
        UpdateZufallskarte()
        LastVektor = Textboxen(0).GetText
        LastVektor = CreateRandomMap(NUDS(1).GetValue, NUDS(2).GetValue, NUDS(0).GetValue, CheckBoxen(1).Checked, LastVektor, MultiValues(0).GetValue(1) / 333, MultiValues(0).GetValue(2) / 333, MultiValues(0).GetValue(3) / 1000, MultiValues(0).GetValue(4) / 100)
    End Sub
    Private Function CreateRandomMap(ByVal Breite As Integer, ByVal Hoehe As Integer, ByVal Spieler As Integer, ByVal Strasse As Boolean, Optional ByVal Startvektor As Integer = -1, Optional ByVal Forestchance As Single = 0.0286, Optional ByVal MountainChance As Single = 0.0125, Optional ByVal Seachance As Single = 0.007024, Optional ByVal Buildingchance As Single = 0.1) As Integer
        Dim SVektor As Integer = Objektverwalter.ZufallskarteV2(Breite, Hoehe, GetNeueSpieler(Spieler), New ObjektRegeln(Spieler, False), Strasse, Startvektor, Forestchance, MountainChance, Seachance, Buildingchance)
        Objektverwalter.Spielfeld.Kartenname = "Random Map=" + SVektor.ToString
        If Strasse Then
            Objektverwalter.Spielfeld.MapPosition = "Use Road Map Generator"
        Else
            Objektverwalter.Spielfeld.MapPosition = "Use Map Generator"
        End If

        SpielKarten(0) = Objektverwalter.Spielfeld
        Kartenname(0) = "Auto-Zufallskarte"
        Objektverwalter.Spielfeld = Nothing
        FestlegenDerKarte(0)
        Objektverwalter.Minimap = New ObjektMinimap(ObjektMinimap.Texturen, ObjektMinimap.Beschreibung, Objektverwalter.Minimap.SpielerTextur, ObjektMinimap.NeutraleTexturen, SpielKarten(0), New Point(400, 200))
        Objektverwalter.Minimap.Wirdgemalt = CheckBoxen(0).Checked
        ReDim GebaeudeZahl(10)
        For I = 0 To GebaeudeZahl.Length - 1
            Select Case I
                Case 0
                    GebaeudeZahl(0).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("STADT")
                Case 1
                    GebaeudeZahl(1).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("BASIS")
                Case 2
                    GebaeudeZahl(2).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("WERFT")
                Case 3
                    GebaeudeZahl(3).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("FLUGHAFEN")
                Case 4
                    GebaeudeZahl(4).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("PIPESTATION")
                Case 5
                    GebaeudeZahl(5).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("LABOR")
                Case 6
                    GebaeudeZahl(6).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("HQ")
                Case 7
                    GebaeudeZahl(7).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("TURM")
                Case 8
                    GebaeudeZahl(8).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("MINE")
                Case 9
                    GebaeudeZahl(9).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("RAKETENSILO+RAKETE")
                Case 10
                    GebaeudeZahl(10).Y = Objektverwalter.GebaeudeTextur.GetGebaeudeID("RADAR")
            End Select
        Next

        Dim S As ObjektSpielfeld = SpielKarten(AngezeigteKarten(MomentaneKarte))
        For I = 0 To S.Landschaften.GetLength(2) - 1
            For X = 0 To S.Breite - 1
                For Y = 0 To S.Hoehe - 1
                    Dim G As ObjektGebaeude = S.Landschaften(X, Y, I).Gebaeude
                    If Not G Is Nothing Then
                        Select Case G.GebaeudeID
                            Case "STADT"
                                GebaeudeZahl(0).X += 1
                            Case "BASIS"
                                GebaeudeZahl(1).X += 1
                            Case "WERFT"
                                GebaeudeZahl(2).X += 1
                            Case "FLUGHAFEN"
                                GebaeudeZahl(3).X += 1
                            Case "PIPESTATION"
                                GebaeudeZahl(4).X += 1
                            Case "LABOR"
                                GebaeudeZahl(5).X += 1
                            Case "HQ"
                                GebaeudeZahl(6).X += 1
                            Case "TURM"
                                GebaeudeZahl(7).X += 1
                            Case "MINE"
                                GebaeudeZahl(8).X += 1
                            Case "RAKETENSILO+RAKETE"
                                GebaeudeZahl(9).X += 1
                            Case "RADAR"
                                GebaeudeZahl(10).X += 1
                        End Select
                    End If
                Next
            Next
        Next
        Return SVektor
    End Function
    Private Sub ResetZufallsMenue()
        If LastVektor <> Textboxen(0).GetText Then
            CreateRandomMap()
        End If
        For Each T In Textboxen
            T.RemoveHandles()
        Next
        ReDim Textboxen(-1)
        ReDim Labels(-1)
        ReDim NUDS(-1)
        ReDim CheckBoxen(-1)
        ReDim MultiValues(-1)
        LoeschenButton("Generieren")
        LoeschenButton("Naechste Karte")
        Objektverwalter.Minimap.Wirdgemalt = False
    End Sub
    Public Shared Function GetNeueSpieler(ByVal Spieler As Integer) As ObjektSpieler()
        Dim neuSpieler(Spieler) As ObjektSpieler
        Dim KOS(1) As ObjektKO
        neuSpieler(0) = New ObjektSpieler(0, Hauptmenue.SpielerNeutral, 0, KOS, 0, Commander_Wars.Armeen.OS.ToString, "", Nothing, ObjektSpieler.KIStufen.Kinderleicht, 0)
        Dim AnzahlderArmeen As Integer = [Enum].GetNames(Commander_Wars.Armeen.AC.GetType).Length - 1
        For I = 0 To Spieler - 1
            Dim Farbe As Color
            Dim I2 As Integer = I
            While I2 > Hauptmenue.AlleFarbtabellen.Length - 1
                I2 -= Hauptmenue.AlleFarbtabellen.Length - 1
            End While
            Farbe = Hauptmenue.AlleFarbtabellen(I2)

            Dim Armee As Armeen = 10
            I2 = I
            While I2 > [Enum].GetNames(Commander_Wars.Armeen.AC.GetType).Length - 1
                I2 -= [Enum].GetNames(Commander_Wars.Armeen.AC.GetType).Length
            End While
            Armee = I2
            Dim Team As Objektverwalter.ABC
            I2 = I
            While I2 > [Enum].GetNames(Objektverwalter.ABC.A.GetType).Length - 1
                I2 -= [Enum].GetNames(Objektverwalter.ABC.A.GetType).Length
            End While
            Team = I2
            If I = 0 Then
                neuSpieler(I + 1) = New ObjektSpieler(I + 1, Farbe, 1000, KOS, 0, Armee.ToString, Team.ToString, Nothing, ObjektSpieler.KIStufen.Mensch, 30000)
            Else
                neuSpieler(I + 1) = New ObjektSpieler(I + 1, Farbe, 1000, KOS, 0, Armee.ToString, Team.ToString, Nothing, ObjektSpieler.KIStufen.Normal, 30000)
            End If
        Next
        Return neuSpieler
    End Function
    Private Sub UpdateZufallskarte()
        Dim T As String = Textboxen(0).GetText
        If IsNumeric(T) Then
            Dim I As Int64 = T
            If I < 0 Then
                I = 0
            ElseIf I > Integer.MaxValue - 1 Then
                I = Integer.MaxValue - 1
            End If

            Textboxen(0).SetText(I)
        Else
            Textboxen(0).SetText("0")
        End If
        Objektverwalter.Minimap.Wirdgemalt = CheckBoxen(0).Checked

    End Sub
#End Region
    Public Overrides Sub ChangeWindowSize(ByVal PosChange As System.Drawing.Point)
        MyBase.ChangeWindowSizeObjekte(PosChange)

        'Spielerinfo auswahl
        If KOInformation IsNot Nothing Then
            KOInformation.ChangeWindowSize(PosChange)
        End If
        For Each SDaten In Spielerdaten
            SDaten.ChangeWindowSize(PosChange)
        Next
        If AlleSpielerVeraenderung IsNot Nothing Then
            AlleSpielerVeraenderung.ChangeWindowSize(PosChange)
        End If
        If EinheitenCheckboxen IsNot Nothing Then
            EinheitenCheckboxen.ChangeWindowSize(PosChange)
        End If


        If KAModus = KAModi.KartenAuswahl Then
            KartenauswahlAktualiesieren()
        ElseIf SpielKarten IsNot Nothing Then
            Dim AktKarte As Integer = AngezeigteKarten(MomentaneKarte)
            Dim AktName As String = SpielKarten(AktKarte).Kartenname
            Dim I2 As Integer = Math.DivRem(DataSettings.BildschirmHoehe - 120, 21, 0)
            Dim MaxMaps As Integer = 0
            For I = 0 To SpielKarten.Length - 1
                If IsAnzeigeKarte(I) Then
                    MaxMaps += 1
                End If
            Next
            If I2 > MaxMaps Then
                I2 = MaxMaps
            End If
            ReDim AngezeigteKarten(I2 - 1)
            ReDim KartenNamen(I2 - 1)
            MomentaneKarte = 0
            AngezeigteKarten(MomentaneKarte) = AktKarte
            KartenNamen(MomentaneKarte) = AktName
            If Objektverwalter.Minimap IsNot Nothing Then
                Objektverwalter.Minimap.Wirdgemalt = False
            End If
        End If
    End Sub

    Public Overrides Sub KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)

    End Sub
End Class

